ZOJ

来源:互联网 发布:nginx 多域名 多站点 编辑:程序博客网 时间:2024/04/30 23:08

B - Problem Arrangement

 ZOJ - 3777 


#include<iostream>#include<cstdio>#include<math.h>#include<cstring>#include<climits>#include<string>#include<queue>#include<stack>#include<set>#include<map>#include<list>#include<vector>#include<sstream>#include<algorithm>using namespace std;#define rep(i,j,k)for(i=j;i<k;i++)#define per(i,j,k)for(i=j;i>k;i--)#define ms(x,y)memset(x,y,sizeof(x))#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define ll long longconst int INF=0x7ffffff;int dp[1<<12][500];int i,j,k,n,m;int mp[12][12];int gcd(int a,int b){    return b==0?a:gcd(b,a%b);}int fact(int x){    int r=1;    for(int i=1;i<=x;i++)        r*=i;    return r;}int main(){    int T;    scanf("%d",&T);    while(T--){        scanf("%d%d",&n,&m);        for(i=0;i<n;i++)        for(j=0;j<n;j++)            scanf("%d",&mp[i][j]);        ms(dp,0);        dp[0][0]=1;        int t=(1<<n)-1;        for(i=0;i<=t;i++)        for(j=0;j<=m;j++){            if(dp[i][j]){                int cnt=0;                for(k=0;k<n;k++)if(i&(1<<k))cnt++;                for(k=0;k<n;k++)                  if(!(i&(1<<k)))                    dp[i|(1<<k)][min(m,j+mp[k][cnt])]+=dp[i][j];            }        }        int a=dp[t][m];        if(!a){            printf("No solution\n");            continue;        }        int b=fact(n);        int c=gcd(a,b);        printf("%d/%d\n",b/c,a/c);    }    return 0;}



0 0