2 条题解

  • 0
    @ 2025-10-8 16:58:20
    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1e9+7;
    int n,a[22][22],dp[1<<21];
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
    	dp[0]=1;//集合里没有女人,肯定也没有男人,方案数为 1
    	for(int S=1;S<1<<n;S++){
    		int S2=S,t=0;
    		while(S2>0) t+=(S2&1)?1:0,S2>>=1;//求有多少个女人,有多少个女人就有多少个男人
    		for(int i=1;i<=n;i++)
    			if(a[t][i]==1&&(S>>(i-1))&1)//判断第 t 个男人是否能和第 i 个女人匹配且集合中有这个女人
    				dp[S]=(dp[S]+dp[S-(1<<(i-1))])%mod;
    	}
    	printf("%d",dp[(1<<n)-1]);
    	return 0;
    }
    
    • 0
      @ 2025-10-8 16:58:09
      #include<bits/stdc++.h>
      using namespace std;
      const int mod=1e9+7;
      int n,a[22][22],dp[1<<21];
      int main(){
      	scanf("%d",&n);
      	for(int i=1;i<=n;i++)
      		for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
      	dp[0]=1;//集合里没有女人,肯定也没有男人,方案数为 1
      	for(int S=1;S<1<<n;S++){
      		int S2=S,t=0;
      		while(S2>0) t+=(S2&1)?1:0,S2>>=1;//求有多少个女人,有多少个女人就有多少个男人
      		for(int i=1;i<=n;i++)
      			if(a[t][i]==1&&(S>>i-1)&1)//判断第 t 个男人是否能和第 i 个女人匹配且集合中有这个女人
      				dp[S]=(dp[S]+dp[S-(1<<i-1)])%mod;
      	}
      	printf("%d",dp[(1<<n)-1]);
      	return 0;
      }
      • 1

      信息

      ID
      1722
      时间
      2000ms
      内存
      1024MiB
      难度
      5
      标签
      递交数
      43
      已通过
      18
      上传者