Description
游戏中,一旦有人在比赛结束前退出游戏。剩下的人就可以支配离开者的物品。现在,玩家A离开游戏,留下了6种物品。玩家B和玩家C要分配玩家A的物品。假设玩家A的6种物品价值分别为1,2,3,4,5,6。已知玩家A的6种物品的数量,判断玩家B和玩家C是否能均分?
Input
每组数据包含6个正整数,分别代表6种物品的数量(不超过10000)。
Output
如果可以均分,输出“YES”;则输出“NO”。
Sample Input
1 0 1 2 0 0
1 0 0 0 1 1
Sample Output
NO
YES
解析
看到题的第一反应就想到多重背包。首先判断物品的总价值能否均分,若能则接着判断玩家B和C能否分别分到总价值的一半
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int c[10],dp[100005],i,j,sum;
while(~scanf("%d%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&c[5],&c[6]))
{
sum=0;
for(i=1;i<=6;i++)
sum+=i*c[i];
if(sum%2!=0)
printf("NO\n");
else
{
int num=1; sum/=2;
int value[10005],cost[10005];
for(i=1;i<=6;i++)
{
for(j=1;j<=c[i];j*=2)
{
value[num]=i*j;
cost[num++]=i*j;
c[i]-=j;
}
if(c[i]>0)
{
value[num]=i*c[i];
cost[num++]=i*c[i];
}
}
memset(dp,0,sizeof(dp));
for(i=1;i<num;i++)
{
for(j=sum;j>=cost[i];j--)
{
dp[j]=max(dp[j],dp[j-cost[i]]+value[i]);
}
}
if(dp[sum]==sum)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}