样例都没过,不知道哪出问题了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int N,K;
long long f[10][1030][11];
int cun[1030];
int num[1030];
int cnt;
int count(int s)
{
int sum=0;
while(s)
{
s=s&(s-1);
sum++;
}
return sum;
}
int main()
{
cin>>N>>K;
for(int i=0;i<=(1<<N)-1;i++)
{
if(!(i&(i<<1)))
{
cun[++cnt]=i;
num[++cnt]=count(i);
f[1][cnt][num[cnt]]=1;
}//提前处理可行的状态
}
for(int i=2;i<=N;i++)
{
for(int j=1;j<=cnt;j++)
{
int s1=cun[j];
for(int k=1;k<=cnt;k++)
{
int s2=cun[k];
if((s1&(s2<<1)))continue;
if((s1&s2))continue;
if((s1&(s2>>1)))continue;
for(int t=num[k]+num[j];t<=K;t++)
f[i][j][t]+=f[i-1][k][t-num[j]];
}
}
}
long long ans=0;
for(int i=1;i<=cnt;i++)
{
ans+=f[N][i][K];
}
cout<<ans<<endl;
return 0;
}