提问者的这个程序中用了循环算法,不过逻辑上有一个小bug,就是在判断到n==0时,如果还有容量,那么返回的应该是第一个物品的重量而不是0。你可以改变容量C或项目参数来检验算法的逻辑正确性。
关于选择输出的,我加了一个队列,用于标记选择的项目。因为完成了所有电位后只有最外层的标记是有效的,所以最后用了一个来循环来完成各层的标记。下面是后面的程序:
int?a[5]={0};
int?MaxW(int?n,?int?C,?int?*体积,?int?*重量)
{
int?W= 0,W1=0,W2=0;
if?(n?==?0)
{
if(C?gt;=? Volunme[0])
{
a[0]=1;
返回?W=1;
} p>
else
return?0;
}
else?if(C?gt;=?Volunme[n])//背包剩余空间可以放下物品n
{
W1?=?MaxW(n-1,?C-Volunme[n],Volunme,Weight)? ?Weight[n];?//容纳n所能获得的重量
W2?=?MaxW(n-1,C,Volunme,Weight);?//不放n所能获得的重量的重量
W=(W1gt;W2?W1:W2);
a[n]=(W1gt;W2?1:0);
}
else//背包空间放不下n,返回判断放n-1的情况
{
return?MaxW(n-1,C,体积,重量);
}
返回?W;
}
int?main(void)
{
int?n=5;int?C=7;
int?Volunme[]?=?{1,2,3,4,5};
int?Weight[]?=?{1,2,5,7,8};
printf("最大重量为d\n",MaxW(n-1, C,体积,重量));
for(int?i=n-2;igt;=0;i--)
{
a [i]=0;
if(a[i 1]==1)
{
C-=Volunme[i 1]; p>
重量[i 1]=0;
}
MaxW(i,C,体积,重量);
}
printf("选择的项目号是:");
for(int?i=0;ilt;5;i )
{
if(a[i]==1)
printf("#d",i 1);
}
printf("\n ");
返回?0;
}