揹包問題
一、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...