题意
给你6件物品每日物品的价值与花费都是i,并且每件物品有最多p[i]件,问你能不能将物品平分成两份
思路
先把总价值求出来,如果总价值是奇数明显不可能。对与第i件物品,如果价值i*p[i]大于背包容量,那么就变成完全背包问题了,否则用多重背包求解。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=120002;
int dp[MAXN];
int p[MAXN];
int main()
{
int kace=1;
while(1)
{
memset(dp,0,sizeof(dp));
int sum=0;
for(int i=1;i<=6;i++)
{
scanf("%d",&p[i]);
sum+=i*p[i];
}
if(!sum) break;
printf("Collection #%d:\n",kace++);
if(sum&1)
{
printf("Can't be divided.\n\n");
continue;
}
else
{
sum/=2;
for(int i=1;i<=6;i++)
{
if(i*p[i]>sum)
{
for(int j=i;j<=sum;j++)
dp[j]=max(dp[j],dp[j-i]+i);
}
else
{
int num=p[i];
for(int k=1;num>0;k<<=1)
{
if(k>num) k=num;
num-=k;
for(int j=sum;j>=k*i;j--)
dp[j]=max(dp[j],dp[j-k*i]+i*k);
}
}
}
}
if(dp[sum]==sum) printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return 0;
}