题意:有一些价值为1~6的大理石,问两个人能不能分到总价值一样的石头。
思路:dp(类似01背包)。把可以取到的值标记起来,需要稍作优化。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
using namespace std;
int a[7];
bool dp[120010];
int main(){
int cas=0;
while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]){
cas++;
int sum=0;
for(int i=1;i<=6;i++){
sum+=a[i]*i;
}
if(sum==0)break;
if(sum&1){
printf("Collection #%d:\n",cas);
printf("Can't be divided.\n\n");
continue;
}
memset(dp,0,sizeof(dp));
dp[0]=1;
int end=0;
for(int i=1;i<=6;i++){
if(a[i])for(int j=end;j>=0;j--){
int tmp=a[i];
if(dp[j]){
while(tmp--){
dp[j+i*(tmp+1)]=1;
}
}
}
if(dp[sum/2])break;
end=end+i*a[i];
}
if(dp[sum/2]){
printf("Collection #%d:\n",cas);
printf("Can be divided.\n\n");
}else{
printf("Collection #%d:\n",cas);
printf("Can't be divided.\n\n");
}
}
return 0;
}