C 實現揹包問題的求解

2021-09-24 15:44:02 字數 1713 閱讀 6102

假設有乙個能裝入總體積為t的揹包和n件體積分別為w1,w2,w2,……,wn的物品,能否從n件物品中挑選若干件恰好裝滿揹包,即使w1+w2+……+wn=t,要求找出所有滿足上述條件的解。例如:當t=10,各件物品的體積{1,8,4,3,5,2}時,可找到下列4組解:

(1,4,3,2)

(1,4,5)

(8,2)

(3,5,2)

可利用回溯法的設計思想來解決揹包問題。首先將物品排成一列,然後順序選取物品裝入揹包,假設已選取了前i件物品之後揹包還沒有裝滿,則繼續選取第i+1件物品,若該物品「太大」不能裝入,則棄之而繼續選取下一件,直至揹包裝滿為止。但如果在剩餘的物品中找不到合適的物品以填滿揹包,則說明「剛剛」裝入揹包的那件物品不合適,應將它取出棄之一邊,繼續再從它之後的物品中選取,如此重複,直至求得滿足條件的解,或者無解。

#include #include using namespace std;

/* 任務描述: 假設有乙個能裝入體積為t的揹包和n件體積分別為w1,w2,…,wn的物品,能否從n件物品中挑選出

若干件恰好裝滿揹包,即時w1 + w2 + …+ wn = t,

要求找出所有滿足上述條件的解。例如:當t=10,各件物品的體積時,

可找到下列4組解:

(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2)。

*///使用棧作為結構體

typedef struct stack;

//向棧中新增元素

int push(stack *s, int data)

//從棧中刪除元素

int pop(stack *s)

int main()

cout<

else

if(sum == t)時,for迴圈裡面進行的操作可以用下列迴圈圖表示。

這樣迴圈下去,如果sum=t,則從棧底first到棧頂top輸出所有元素,如果sumt,出棧。當r=n時,使p+1,且讓r=p,當p=n時,說明使元素1作為棧底元素已經把所有情況都遍歷完。此時跳出迴圈,使之後的元素作為棧底元素,重複上述操作。

1.揹包體積t=10,各件物品的體積{1,8,4,3,5,2}

2.揹包體積t=20,各件物品體積{5 ,8, 4, 3, 6, 9, 2, 1}

揹包問題 c 回溯法求解揹包問題

給定n種物品和乙個揹包。物品i的重量是wi,其價值為pi,揹包的容量為c。應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?根據題目所給的資訊可知就是在wi共有5種物品,即n 5 揹包容量c 30 各物品的重量 wi 5 各物品的價值為 p i 所以所求揹包中的物品的價值最大就是 while...

揹包問題的求解

1 問題描述 假設有乙個能裝入總體積為t的揹包和n件體積分別為w1,w2,wn的物品,能否從n件物品中挑選若干件恰好裝滿揹包,即使w1 w2 wm t,要求找出所有滿足上述條件的解。2 設計功能要求 例如 當t 10,各件物品的體積時,可找到下列4組解 1,4,3,2 1,4,5 8,2 3,5,2...

動態規劃求解揹包問題(JAVA實現)

package com.knapsack.problem public class backpack 商品的重量 int p 商品的價值 int c backpack solution m,n,w,p 儲存運算過程的陣列 for int i 0 i n i printpack c,w,m,n par...