(资料图)
1、提问者的这程序中用了递归算法,不过逻辑上有个小bug,就是在判断到n==0时,如果还有容量,那么返回的应该是第一个物品的重量而不是0。
2、你可以改变容量C或物品参数来检验算法的逻辑正确性。
3、 关于输出选择的物品,我加了一个数组,用来标记选择的物品。
4、因为做完所有递归后只有最外层的标记是有效的,所以最后用了一个for循环来完成各层的标记。
5、下面是改动后的程序: inta[5]={0}; intMaxW(intn,intC,int*Volunme,int*Weight) { intW=0,W1=0,W2=0; if(n==0) { if(C>=Volunme[0]) { a[0]=1; returnW=1; } else return0; } elseif(C>=Volunme[n])//背包剩余空间可以放下物品n { W1=MaxW(n-1,C-Volunme[n],Volunme,Weight)+Weight[n];//放入n所能得到的重量 W2=MaxW(n-1,C,Volunme,Weight);//不放n所能得到的重量 W=(W1>W2?W1:W2); a[n]=(W1>W2?1:0); } else//背包空间放不下n,返回判断放n-1的情况 { returnMaxW(n-1,C,Volunme,Weight); } returnW; } intmain(void) { intn=5;intC=7; intVolunme[]={1,2,3,4,5}; intWeight[]={1,2,5,7,8}; printf("最大重量为%d",MaxW(n-1,C,Volunme,Weight)); for(inti=n-2;i>=0;i--) { a[i]=0; if(a[i+1]==1) { C-=Volunme[i+1]; Weight[i+1]=0; } MaxW(i,C,Volunme,Weight); } printf("选择的物品号是:"); for(inti=0;i<5;i++) { if(a[i]==1) printf("#%d",i+1); } printf(""); return0; }if(n==0)应该改成if(n<0)才对,表示没有物品可选了。
6、我的一个改进,但输出选择项还是有问题!#include
本文到此分享完毕,希望对大家有所帮助。
上一篇:“闹心”!公募“曙光”在哪里?
下一篇:最后一页
X 关闭
Copyright © 2015-2023 京津冀母婴网版权所有 备案号:京ICP备2022022245号-12 联系邮箱:434 922 62 @qq.com