(多重背包)HDU1059Dividing

HDU1059Dividing

题意&思路:

给你质量为1~6的宝石的个数,问能不能等分。
对于总质量为奇数的肯定不能等分,对于质量为偶数的,只要dp[m]==m(m=sum/2)就可以等分,这样就是多重背包问题了。坑点是输出格式,要两个换行。

代码:

#include<bits/stdc++.h>
const int N=1e5+10;
const int mod=1e7+9;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
int a[7],dp[N];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int sum,i,j,k,t=0;
	while(1)
	{
		sum=0;
		t++;
		memset(dp,0,sizeof(dp));
		for(i=1;i<=6;i++)
		{
			cin>>a[i];
			sum=sum+a[i]*i;
		} 
		if(sum==0)
			break;
		else if(sum%2==1)
		{
			printf("Collection #%d:\nCan't be divided.\n\n",t);
			continue;
		}
		else
		{
			int m=sum/2;
			for(i=1;i<=6;i++)
			{
				int num=min(a[i],m/i);
				for(j=1;num>0;j<<=1)
				{
					if(j>num)
						j=num;
					num-=j;
					for(k=m;k>=j*i;k--)
						dp[k]=max(dp[k],dp[k-j*i]+j*i);	
				}	
			} 
			if(dp[m]==m)
				printf("Collection #%d:\nCan be divided.\n\n",t);
			else
				printf("Collection #%d:\nCan't be divided.\n\n",t);
		}
	}
	return 0;
}

发布了78 篇原创文章 · 获赞 0 · 访问量 1423

猜你喜欢

转载自blog.csdn.net/Z7784562/article/details/103870222