如题,到底为什么?
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,cnt=0;
int num[1<<11],s[1<<11],dp[11][1<<11][105];
signed main(){
scanf("%lld%lld",&n,&k);
for(int i = 0;i<=(1<<n);i++){
if(!(i&i>>1)) s[++cnt]=i;
int x=i;
while(x){
if(x&1) num[i]++;
x=x>>1;
}
}
/* cout<<cnt<<endl;
for(int i = 1;i<=cnt;i++) cout<<s[i]; cout<<endl;
for(int i = 0;i<=(1<<n);i++) cout<<num[i]<<" "; cout<<endl;*/
for(int i = 0;i<=cnt;i++)
dp[1][i][num[i]]=1;
for(int i = 1;i<=n;i++){
for(int a=1;a<=cnt;a++){
for(int b =1;b<=cnt;b++){
if(!(s[a]&(s[b]|(s[b]>>1)|(s[b]<<1)))){
for(int j = num[a];j<=k;j++)
dp[i][a][j]+=dp[i-1][b][j-num[a]];
}
}
}
}
int ans=0;
for(int i = 1;i<=cnt;i++)
//for(int j = 1;j<=cnt;j++)
ans+=dp[n][i][k];
printf("%lld",ans);
return 0;
}