hdu4739 状压DP+01背包入门

for(int i=0;i for(int ss=V;ss>=0;ss--)
if(ss&s[i]==s[i])
dp[ss]=max(dp[ss],dp[ss^s[i]]+1);

JN亲自教我的!!

如果ss中有1,2,3.这三种物品,s[i]是3号物品,if这句话表示{1,2,3}含有{3}而dp[ss^s[i]]表示ss集合中去除s[i]后。

记住啊!


#include 
#include 
#include 
#include 
#include 
using namespace std;
struct s{
	int x,y;
}p[25];
int cmp(s a,s b){
	if(a.x==b.x)
		return a.yvv;
int dp[1200000];
int main()
{
	int n;
	while(~scanf("%d",&n)&&n!=-1){
		for(int i=0;i=0;V--){
				if((V&vv[i])==vv[i])
					dp[V]=max(dp[V],dp[V^vv[i]]+1);
			}
		}
		printf("%d\n",dp[(1<


你可能感兴趣的:(dp)