zoj 3777
状态压缩dp
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 4100 using namespace std; int map[13][13]; int dp[maxn][510]; int gcd(int x,int y) { return y==0?x:gcd(y,x%y); } int main() { int t; int n,m; scanf("%d",&t); while(t--) { memset(dp,0,sizeof dp); scanf("%d%d",&n,&m); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]); dp[0][0]=1; int cnt,tmp; for(int i=0;i<(1<<n);i++) { cnt=0; for(int j=0;j<n;j++) if(i&(1<<j))cnt++;//更新到第cnt+1列了; for(int j=0;j<n;j++) { if(i&(1<<j))continue; for(int k=0;k<=m;k++) { tmp=min(m,k+map[j][cnt]); dp[i|(1<<j)][tmp]+=dp[i][k]; } } } tmp=1; for(int i=1;i<=n;i++) tmp*=i; int ans=dp[(1<<n)-1][m]; if(ans==0) { puts("No solution"); continue; } cnt=gcd(tmp,ans); printf("%d/%d\n",tmp/cnt,ans/cnt); } return 0; }