其他分享
首页 > 其他分享> > 状态压缩泛做

状态压缩泛做

作者:互联网

P3052 [USACO12MAR]Cows in a Skyscraper G

预处理出每种状态的体积和,然后枚举子集转移。

时间复杂度 \(O\left(3^n\right)\)。

code:

#include<bits/stdc++.h>
using namespace std;
#define N 262144
#define Min(x,y)((x)<(y)?x:y)
#define For(i,x,y)for(i=x;i<=(y);i++)
int s[N],f[N],w[19];
int main()
{
	int n,i,j;
	cin>>n>>w[0];
	For(i,1,n)cin>>w[i];
	For(i,1,(1<<n)-1)
	{
		For(j,1,n)
		if(i&1<<(j-1))s[i]+=w[j];
		f[i]=n;
	}
	For(i,1,(1<<n)-1)
	for(j=i;j;j=(j-1)&i)
	if(s[j]<=w[0])f[i]=Min(f[i],f[i^j]+1);
	cout<<f[(1<<n)-1];
	return 0;
}

但是要开 O2 才能过,考虑复杂度更低的做法。

标签:状态,right,Min,压缩,262144,code,复杂度,define
来源: https://www.cnblogs.com/May-2nd/p/14371664.html