hdu 1059 Dividing 完全背包

版权声明:欢迎转载,转载请注明出处,如有错误,还望指出,谢谢 博客地址:https://blog.csdn.net/lanyanzhiji123asd https://blog.csdn.net/lanyanzhiji123asd/article/details/87623062

题目链接   http://acm.hdu.edu.cn/showproblem.php?pid=1059

完全背包

用二进制转化下

任何就可以变成01背包来做

具体完全背包看这个  https://blog.csdn.net/lanyanzhiji123asd/article/details/87621636

#include<bits/stdc++.h>
using namespace std;
#define ll long long int
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
vector<int>mp;
int cas=1;
int a[10]; 
int dp[1500005];
int main()
{
	std::ios::sync_with_stdio(false);
	int i,sum,j;
	while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]&&(a[1]+a[2]+a[3]+a[4]+a[5]+a[6]))
	{
		mp.clear();
		sum=0;
		memset(dp,0,sizeof(dp));
		for(i=1;i<=6;i++)
		{
			sum+=a[i]*i;
			for(j=1;j<a[i];j*=2)
			{
				mp.push_back(j*i);
				a[i]-=j; 
			}
			if(a[i]>0)
			{
				mp.push_back(a[i]*i);
			}
		}
		cout<<"Collection #"<<cas++<<":"<<endl;
		if(sum%2)
		{
			cout<<"Can't be divided."<<endl<<endl;
			continue;
		}
		sum/=2;
		for(i=0;i<mp.size();i++)
		{
			for(j=sum;j>=mp[i];j--)
			{
				dp[j]=max(dp[j],dp[j-mp[i]]+mp[i]);
			}
		}
		if(dp[sum]==sum)
			cout<<"Can be divided."<<endl<<endl;
		else
			cout<<"Can't be divided."<<endl<<endl; 
	}

	return 0;
} 

猜你喜欢

转载自blog.csdn.net/lanyanzhiji123asd/article/details/87623062