https://www.luogu.com.cn/problem/P1896
我这题代码写的很乱,思路也乱,因此查了半天也没看出错哪,还越改越错。。。
代码求调
#include<bits/stdc++.h>
using namespace std;
int n,k,r,s[6000];
int N;
int a[6000];
int dp[10][15000][80];
int one(int x)
{
int cnt=0;
while(x)
{
x&=x-1;
cnt++;
}
return cnt;
}
int main()
{
cin>>n>>k;
N=(1<<n)-1;
for(int i=0;i<=N;i++)
{
if(i&(i<<1))continue;
a[++r]=i;
s[r]=one(a[r]);
if(s[r]<=k)
dp[1][i][s[r]]=1;
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=r;j++)
{
if(s[j]>k)continue;
for(int k=1;k<=r;k++)
{
if(s[j]+s[k]>k)continue;
if(a[j]&a[k])continue;
if(a[j]&(a[k]<<1))continue;
if(a[j]&(a[k]>>1))continue;
dp[i][a[k]][s[j]+s[k]]+=dp[i-1][a[j]][s[j]];
}
}
}
int sum=0;
for(int j=1;j<=r;j++)
sum+=dp[n][a[j]][k];
cout<<sum;
return 0;
}