戳这里原题1014
大致题意:
有六种价值分别为1-6的矿石..各有num [ i ] 个…问两个人能否分得同样多价值的矿石
。
多重背包加二进制优化的方法。貌似还有纯dp和dfs有待探究。
首先很明显如果总价值为0,或者是奇数,那显然不能均分。
剩下如果是偶数,用多重背包,dp[j]记录能装价值为j的石头时,可装的最大价值。还有二进制优化喽。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int dp[1000000];
int n[10],ans=1,i,k,j,sum;
int main()
{
while(1)
{
sum = 0;
for(i = 1;i <= 6;i ++)
{
cin>>n[i];
sum += n[i]*i;
}
if(sum==0) break;
if(sum % 2 == 1) printf("Collection #%d:\nCan't be divided.\n\n",ans);
else
{
memset(dp,0,sizeof(dp));
sum/= 2;
for(i = 1;i <= 6;i ++)
{
k = 1;
while(n[i] > k)
{
for(j = sum;j >= k * i;j --)
dp[j] = max(dp[j],dp[j-k*i] + k*i);
n[i] -= k;
k *= 2;
}
for(j = sum;j >= n[i] * i;j --)
dp[j] = max(dp[j],dp[j-n[i]*i] + n[i] * i);
}
if(dp[sum] == sum)
printf("Collection #%d:\nCan be divided.\n\n",ans);
else
printf("Collection #%d:\nCan't be divided.\n\n",ans);
}
ans ++;
}
return 0;
}