蒟蒻求助——状压模板题
查看原帖
蒟蒻求助——状压模板题
233957
190040257a楼主2020/8/18 07:39

样例都没过,不知道哪出问题了

#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;
}
2020/8/18 07:39
加载中...