題意:有6種不同價值的石頭,告訴你每種石頭的數量。現在兩個人要平分這些石頭,希望每個人得到的價值相同的。問是否可以達到要求的方案。
思路:標準的多重揹包,因爲找到是否存在解,把數量二進制分解就行了。
代碼如下:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX = 200010;
int a[MAX],dp[MAX];
int main(void)
{
//freopen("input.txt","r",stdin);
int cas = 1;
while(1){
int sum = 0;
for(int i = 1; i <= 6; ++i){
scanf("%d",&a[i]);
sum += a[i] * i;
}
if(sum == 0) break;
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(int i = 1; i <= 6; ++i){
int num = a[i];
for(int k = 1; num > 0; k <<= 1){
int mul = min(k,num);
for(int j = sum; j >= i * mul; --j)
if(dp[j-i*mul]) dp[j] = 1;
num -= mul;
}
}
printf("Collection #%d:\n",cas++);
if(sum&1 || dp[sum>>1] == 0)
puts("Can't be divided.\n");
else
puts("Can be divided.\n");
}
return 0;
}