大家好,小淋來為大家解答以上問題。c語言解決背包問題,c語言背包問題很多人還不知道,現在讓我們一起來看看吧!
1、提問者在這個程序中使用了遞歸算法,但是邏輯上有個小bug,就是判斷n==0時,如果還有容量,那么應該返回第一項的權重,而不是0。可以通過改變容量C或項目參數來檢查算法的邏輯正確性。
2、關于所選項的輸出,我添加了一個數組來標記所選項。因為所有遞歸后只有最外層的標簽有效,所以使用for循環來完成每一層的標簽。下面是修改后的過程:
3、inta[5]={ 0 };
4、intMaxW(整數,整數,整數*體積,整數*重量)
5、{
6、intW=0,W1=0,W2=0;
7、如果(n==0)
8、{
9、if(C=Volunme[0])
10、{
11、a[0]=1;
12、returnW=1;
13、}
14、其他
15、return0
16、}
17、Elseif(C=Volunme[n])//背包剩余空間可以裝下物品n。
18、{
19、W1=MaxW(n-1,C-Volunme[n],Volunme,Weight)Weight[n];//放入n可以得到的重量。
20、W2=MaxW(n-1,C,體積,重量);//不放N可以得到的權重
21、W=(W1W2?w 1: w2);
22、a[n]=(W1W2?1:0);
23、}
24、Else//背包空間已經容不下N個了。回到放n-1的情況。
25、{
26、returnMaxW(n-1,C,Volunme,Weight);
27、}
28、returnW
29、}
30、intmain(void)
31、{
32、intn=5;intC=7;
33、intvolume[]={ 1,2,3,4,5 };
34、intWeight[]={1,2,5,7,8 };
35、Printf('最大重量為% d \ n ',maxw (n-1,c,volunme,weight));
36、for(inti=n-2;I=0;我-)
37、{
38、a[I]=0;
39、if(a[i 1]==1)
40、{
41、c-=Volunme[I 1];
42、權重[I 1]=0;
43、}
44、MaxW(i,C,Volunme,Weight);
45、}
46、Printf('所選項目編號為:');
47、for(inti=0;i5;我)
48、{
49、if(a[i]==1)
50、printf('#%d ',I 1);
51、}
52、printf(' \ n ');
53、return0
54、}
本文到此結束,希望對大家有所幫助。