level 11
放開那條香蕉
楼主
u1014的题目:有价值为1.2.3.4.5.6的石头,个数分别为a[1~~6],2人能否平均分得相同价值。先排除掉总价值奇数的情况,我把两人分得平均值aver看成背包最大载重,然后从中选择最大利益的情况,看是否与aver相等,如果是可以平分,反之不可以。不知对不对.可是代码
runtimeerror![[拍砖]](/static/emoticons/u62cdu7816.png)
#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
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;
}