揹包問題的幾種解法及變形

2021-06-22 01:16:32 字數 2288 閱讀 5479

揹包問題

一、01揹包

問題描述:

給定n種物品和乙個揹包, 物品i的重量是wi, 價值是vi, 揹包容量為w

•對於每個物品,要麼裝揹包,要麼不裝

•選擇裝揹包的物品集合,使得物品總重量不超過揹包容量w, 且價值和盡量大

限制條件: 1<=n<=100   1<=wi,vi<=100   1<=w<=10000

輸入:

4 52 3

1 23 4

2 2輸出:

7

i表示物品編號

j表示剩餘揹包容量

1.首先給出最樸素的方法,針對每個物品是否放入揹包進行搜尋 

時間複雜度:o(2^n)

#include#define m 100

using namespace std;

int n, w;

int w[m], v[m];

//從第i個物品開始挑選總重小於j的部分

int ret(int i, int j)

int main()

cout<

#include#include#define m 100

using namespace std;

int n, w;

int w[m], v[m];

int dp[m+1][m+1];

//從第i個物品開始挑選總重小於j的部分

int ret(int i, int j)

int main()

memset(dp, -1, sizeof(dp));

cout<

#include#include#define m 100

using namespace std;

int n, w;

int w[m], v[m];

//sum為目前放入物品的價值總和

int ret(int i, int j, int sum)

int main()

cout

dp[i+1][j]  = dp[i][j]                                             (j

= max(dp[i][j],dp[i][j-w[i]]+v[i])       其他

#include#include#define m 100

using namespace std;

int n, w;

int w[m], v[m];

int dp[m+1][m+1];

int main()

memset(dp, 0, sizeof(dp));

for(i = 0; i < n; i++)

memset(dp, 0, sizeof(dp));

for(i = 0; i < n; i++)

}cout

= dp[i][j]

(j < w[i])

= max(dp[i

][j],dp[i+1][j-

w[i]]+

v[i])    其他

#include#include#define m 100

using namespace std;

int n, w;

int w[m], v[m];

int dp[m+1][m+1];

int main()

memset(dp, 0, sizeof(dp));

for(i = 0; i < n; i++)

{for(j = 0; j <= w; j++)

{if(j

01揹包問題 優化及變形

問題描述 有n件商品,第i件商品的重量是weights i 1 價值是values i 1 揹包容量是cap 則揹包能夠裝物品的最大價值首先構建乙個二維陣列dp,dp i j 表示第i件物品時揹包容量為j時的最大價值。如何求得dp i j 1 values i 1 j,說明第i件物品不能放入當前容量...

python解決揹包 揹包變形問題

有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。例如 揹包的承重為10,現在有a,b,c,d,e五件物品,每件物品的重量分別為2,2,6,5,4,價值分別為6,3,5,4...

01揹包問題變形

一 問題 二 解題思路 三 c 下面是我自己理解寫的,沒有根據標準答案的,那答案在講啥?一直沒法ac,不過還是可以解決問題的。n件物品按單位重量價值降序排序,然後回溯法裝,右結點必要時剪枝,剛好湊成重量為m的若干件物品才能得到乙個解。include define max 50 using names...