ZOJ 3777Problem Arrangement(状压DP)

来源:互联网 发布:cms始源勇者王 编辑:程序博客网 时间:2024/05/28 15:53
#include<iostream>#include<cstdio>#include<algorithm>#include<cstdlib>#include<cmath>#include<string.h>#include<cstring>#include<string>#include<map>#include<set>#include<vector>#include<queue>using namespace std;typedef long long ll;#define sp  system("pause")#define mt(dp) memset(dp,0,sizeof dp)int in[13][13];int dp[(1<<13)+20][550];int gcd(int a,int b)  {      if(b==0)          return a;      else          return gcd(b,a%b);  }  int main(){int T;cin>>T;while(T--){int n,mm;cin>>n>>mm;memset(dp,0,sizeof dp);for(int i=0;i<n;i++){for(int j=0;j<n;j++)scanf("%d",&in[i][j]);}dp[0][0]=1;int cot=0,time=0;for(int i=0;i<=(1<<n);i++){int num=0;for(int k=0;k<n;k++){if(i&(1<<k))num++;}for(int k=0;k<n;k++){if((i&(1<<k)))continue;for(int j=0;j<=mm;j++){if(dp[i][j]==0)continue;if(j+in[num][k]>=mm){//time+=(dp[i][j])*(num+1);dp[i^(1<<k)][mm]+=dp[i][j];}else dp[i^(1<<k)][j+in[num][k]]+=dp[i][j];}}}cot=dp[(1<<n)-1][mm];if(cot==0)printf("No solution\n");else {time =1;for(int i=2;i<=n;i++)time*=i;int xx=gcd(time,cot);printf("%d/%d\n",time/xx,cot/xx);}}//sp;return 0;}
0 0
原创粉丝点击