求解,这题可以看成01背包问题解决吗?
c语言吧
全部回复
仅看楼主
level 11
u1014的题目:有价值为1.2.3.4.5.6的石头,个数分别为a[1~~6],2人能否平均分得相同价值。先排除掉总价值奇数的情况,我把两人分得平均值aver看成背包最大载重,然后从中选择最大利益的情况,看是否与aver相等,如果是可以平分,反之不可以。不知对不对.可是代码
runtimeerror[拍砖]
#include<stdio.h>
#include<string.h>
int f[1000][1000],m[10024];
int main()
{
int a[100]={0},i,j,sum,total,aver,q=1,n;
while(1)
{
sum=0;total=0;n=1;memset(m,0,sizeof(m));memset(f,0,sizeof(f));
for(i=1;i<=6;i++)
{scanf("%d",&a[i]);sum+=a[i]*i;total+=a[i];}
aver=sum/2;
for(i=1;i<=6;i++)
if(a[i]!=0) break;
if(i>6) break;
for(i=1;i<=6&&i<=aver;i++)
for(j=1;j<=a[i];j++)
m[n++]=i;
printf("Collection #%d:\n",q++);
if(sum%2==1) {printf("Can't be divided.\n");continue;}
//下面当01背包问题解
for(i=1;i<=total;i++)
for(j=1;j<=aver;j++)
if(j>=m[i])
if(m[i]+f[i-1][j-m[i]]>f[i-1][j])
f[i][j]=m[i]+f[i-1][j-m[i]];
else f[i][j]=f[i-1][j];
else f[i][j]=f[i-1][j];
if(f[total][aver]==aver) printf("Can be divided.\n");
else printf("Can't be divided.\n");
}
return 0;
}

2012年03月08日 03点03分 1
level 5
想到第一个种方法:
总重量为K
K为奇自然不能,
K为偶数,如果能平分,平分后为K/2
让一个人先拿,如果能找到一种方法让这个人拿走K/2的花,就可以,递归穷举
第二种方法,不知道对不对,只是猜测,
是不是一个重量的石头的数量为偶数,就可以直接抵消,如果可以,应该就方便多了
2012年03月08日 04点03分 2
level 11
第二种方法错的,我第一次做这题就是这方法,最近学了背包,突然想到了把这题看成背包做
2012年03月08日 04点03分 3
level 5
没看代码,等下看看,[Love]
2012年03月08日 04点03分 4
level 11
回复5楼:既然总数量知道,不可以看成是不同的物体,但是价值相同吗。
2012年03月08日 05点03分 6
level 5
你的意思是不是 石头 1的 价值 和 体积 都是 1,其他也一样
背包的容量 为 aver
然后求最大 装载时的 结果是不是aver,
2012年03月08日 05点03分 7
level 11
回复7楼:恩,就是这样
2012年03月08日 05点03分 9
1