假設有乙個能裝入總體積為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...