每行的状态用二进制数表示~~自己好些地方没细心~导致WA了很久..
Program:
#include<iostream> #include<stdio.h> #include<string.h> #include<set> #include<algorithm> #include<cmath> #define oo 1000000007 #define ll long long #define pi acos(-1.0) #define MAXN 505 using namespace std; ll dp[12][1026][12]; int canuse[15],w[15],num; bool judge(int a) { bool f=false; int x=a; w[num+1]=0; while (x) w[num+1]+=x%2,x/=2; while (a) { if (a%2 && f) return false; if (a%2) f=true; a/=2; } return true; } bool ok(int a,int b) { while (a && b) { if (a%2 && b%2) return false; a/=2,b/=2; } return true; } int main() { int n,k,t,i,j,x; ll ans; while (~scanf("%d%d",&n,&k)) { if (k>n) { printf("0\n"); continue; } memset(dp,0,sizeof(dp)); num=0; for (i=0;i<(1<<n);i++) if (judge(i)) canuse[++num]=i; dp[0][0][0]=1; for (t=1;t<=n;t++) for (i=1;i<=num;i++) for (j=0;j<(1<<n);j++) if (ok(canuse[i],j)) for (x=0;x<=k-w[i];x++) dp[t][canuse[i]+j][x+w[i]]+=dp[t-1][j][x]; ans=0; for (i=0;i<(1<<n);i++) ans+=dp[n][i][k]; printf("%I64d\n",ans); } return 0; }