揹包問題的遞迴和非遞迴的解法

2021-06-20 21:24:36 字數 1163 閱讀 1826

[cpp]view plain

copy

/**簡單揹包問題

問題定義:

有乙個揹包重量是s,有n件物品,重量分別是w0,w1...wn-1

問能否從這n件物品中選擇若干件放入揹包中使其重量之和正好為s

*/#include 

#include 

#include 

#include 

using

namespace

std;  

const

intmaxsize=100;  

intn,s;

//n是有多少中物品,s是要湊足的重量

bool

visit[maxsize];

//標記是否被訪問過,別訪問過標記為1,沒有訪問過為0

intw[maxsize];

//記錄每一種物品的重量

intq[maxsize];

//相當於乙個棧,儲存被訪問過的物品的編號

intbeibao()  

}  //如果檢索到最後,也就是說棧頂前面的物品都不符合條件

//因此可能棧內的元素有問題,所以彈出棧頂元素,不把棧頂元素計算在內

if(i==n)  

}  }  //揹包問題遞迴版本

/**解釋:其選擇只有兩種可能,選擇一組物品中包含wn-1 ,此時knap(s,n)的解就是knap(s - wn-1,n-1)的解

如果選擇的物品中不包括wn-1,這樣knap(s,n)的解就是knap(s,n-1)的解

knap(s,n) = true, 當 s=0時

false ,當s < 0 或者 s > 0 且 n < 1

knap(s - wn-1,n-1) || knap(s,n-1) 當s>0且n>=1

*/bool

knap(

ints,

intn)  

else

return

knap(s,n - 1);  

}  int

main()  

intt=beibao();  

knap(s,n);  

if(t!=-1)  

else

cout<<-1<

}  

簡單的揹包問題 非遞迴和遞迴

問題描述 從一堆物品中選出滿足特定要求的數個物品,求方案 從重量1 4 4 5 7的5個物品中選出數個,要求總重量為10 分析 略 遞迴演算法 int knap int w,int t,int n stack void init stack s int isempty stack s void pu...

0 1揹包的遞迴解法

1 輸入物品個數n,揹包容量w 2 定義物品價值列表v,物品體積列表w 3 def rec i,j 從第i個物品開始挑選總重小於j的部分 4 res 0 5 if i n 剩餘物品為0 6 return res 7 elif j w i 無法挑選該物品 8 res rec i 1,j 9 else ...

揹包問題的非遞迴演算法

const int m 12 揹包重m斤 int subjects 物件陣列,重量 價值 int currentweight 0,currentvalue 0 當前重量,當前價值 int maxvalue 0 最優價值 for int i 0 i subjects.getupperbound 0 1...