链接:点击打开链接
题意:有价值为1,2,3,4,5,6的6种物品,输入6个物品的数量,问能不能将物品分成价值相等的两份(物品不能分割)
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
bool f[500005];
int w[10],v[10],used[500005];
int main(){
int i,j,cas,sum,sign;
cas=1;
while(scanf("%d",&w[0])!=EOF){
sum=sign=0;
for(i=1;i<6;i++)
scanf("%d",&w[i]);
if(!(w[0]||w[1]||w[2]||w[3]||w[4]||w[5]))
break;
for(i=0;i<6;i++){
v[i]=i+1;
sum+=v[i]*w[i];
}
printf("Collection #%d:\n",cas++);
if(sum%2){ //先看总数是否是偶数
puts("Can't be divided.\n");
continue;
}
memset(f,0,sizeof(f));
f[0]=1;
for(i=0;i<6;i++){
memset(used,0,sizeof(used)); //used数组表示当前容量需要多少个i
for(j=v[i];j<=sum;j++){
if(f[j-v[i]]&&!f[j]&&used[j-v[i]]<w[i]){
f[j]=1;
used[j]=used[j-v[i]]+1;
if(f[sum/2]){ //如果可以达到sum/2就不用继续找了
sign=1;
goto next;
}
}
}
}
next:
if(sign)
puts("Can be divided.\n");
else
puts("Can't be divided.\n");
}
return 0;
}