版权声明:欢迎转载,转载请注明出处,如有错误,还望指出,谢谢 博客地址: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;
}