RT,刚学状压,但是写挂了
#include<bits/stdc++.h>
using namespace std;
const int maxn=2050;
typedef long long ll;
int dp[20][maxn][20];
int bit[maxn],hf[maxn],cnt=0;
int main()
{
ios::sync_with_stdio(false);
int n,k;
cin>>n>>k;
dp[0][0][0]=1;
for(int i=0;i<1<<n;i++)
{
int num=0,tmp=i;
while(tmp)
tmp&=tmp-1,num++;
bit[i]=num;
if((i&(i<<1))==0&&(i&(i>>1))==0)
hf[++cnt]=i;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=cnt;j++)
{
for(int t=1;t<=cnt;t++)
{
if((hf[j]&hf[t])==0&&((hf[t]*2)&hf[j])==0&&((hf[t]/2)&hf[j])==0)
{
for(int x=0;x<=k;x++)
{
if(x-bit[hf[j]]>=0)
dp[i][hf[t]][x]+=dp[i-1][hf[t]][x-bit[hf[j]]],cout<<dp[i][hf[t]][x]<<" ";
}
}
}
}
}
cout<<endl<<endl;
ll ans=0;
for(int i=1;i<=cnt;i++)
ans+=dp[n][hf[i]][k];
cout<<ans<<endl;
return 0;
}