特點是:每種物品僅有一件,可以選擇放或不
放。用子問題定義狀態:即 f[i,v] 表示前 i 件物品恰放入乙個容量為 v 的揹包可
以獲得的最大價值。則其狀態轉移方程便是:
f[i,v] = max
杭電2602題
傳送門:杭電2602題
坑點:1
5 02 4 1 5 1
0 0 1 0 0
答案是12
過了題目資料和這組資料,基本就能ac了~
基本思路:「將前 i 件物品放入容量為 v 的揹包
中」這個子問題,若只考慮第 i 件物品的策略(放或不放),那麼就可以轉化
為乙個只和前 i − 1 件物品相關的問題。如果不放第 i 件物品,那麼問題就轉化
為「前 i − 1 件物品放入容量為 v 的揹包中」,價值為 f[i − 1,v] ;如果放第 i 件物
品,那麼問題就轉化為「前 i − 1 件物品放入剩下的容量為 v − c i 的揹包中」,
此時能獲得的最大價值就是 f[i − 1,v − c i ] 再加上通過放入第 i 件物品獲得的
偽**如下:
f[0,0…v ] ← 0
for i ← 1 to n
for v ← c i to v
f[i,v] ← max
#include#include#includeusing namespace std;
int n,m; //n為物品的個數,m為書包的承重
int value[1005]; //value為各物品的價值
int weight[1005]; //weight為個物品的重量
int dp[1005][1005]; //dp陣列
int bag() //0-1揹包
} return dp[n][m]; //返回結果
}int main()
由dp[i][w]=max(dp[i-1][w-w[i]]+c[i], dp[i-1][w]可以看出要求第i組的dp [w]需要的是第i-1組的dp[w-w[i]]+c[i]和dp[w],即求dp[w]時需要當前的資料和w位置前的資料,因此求第i組的時候需要逆序求解,這樣可以保證求dp[w]時所需的兩個資料都是上一組的,而且當w<w[i]時dp[w]=dp[w],
#include#include#includeusing namespace std;
int n,m; //n為物品的個數,m為書包的承重
int value[1050]; //value為各物品的價值
int weight[1050]; //weight為個物品的重量
int dp[1050]; //dp陣列
int bag() //0-1揹包
return dp[m]; //返回重量m的最大價值
}int main()
{ int result,t;
cin>>t; //輸入例子數
while(t--)
{ cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>value[i]; //輸入價值
for(int i=1;i<=n;i++)
cin>>weight[i]; //輸入重量
result=bag(); //得到結果
cout《我們看到的求最優解的揹包問題題目中,事實上有兩種不太相同的問法。
有的題目要求「恰好裝滿揹包」時的最優解,有的題目則並沒有要求必須把背
包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。
如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了 f[0] 為 0 ,其
它 f[1…v ] 均設為 −∞ ,這樣就可以保證最終得到的 f[v ] 是一種恰好裝滿揹包的
最優解。
如果並沒有要求必須把揹包裝滿,而是只希望**盡量大,初始化時應該
將 f[0…v ] 全部設為 0 。
這是為什麼呢?可以這樣理解:初始化的 f 陣列事實上就是在沒有任何物
品可以放入揹包時的合法狀態。如果要求揹包恰好裝滿,那麼此時只有容量
為 0 的揹包可以在什麼也不裝且價值為 0 的情況下被「恰好裝滿」,其它容量的
揹包均沒有合法的解,屬於未定義的狀態,應該被賦值為-∞了。如果揹包並非
必須被裝滿,那麼任何容量的揹包都有乙個合法解「什麼都不裝」,這個解的
價值為 0 ,所以初始時狀態的值也就全部為 0 了。
這個小技巧完全可以推廣到其它型別的揹包問題。
《揹包問題九講 》崔添翼 (tianyi cui)
動態規劃 01揹包
最優二叉查詢樹.cpp 定義控制台應用程式的入口點。01揹包問題。include stdafx.h include include define n 3 the number of real node define m 10 using namespace std int tmain int arg...
01揹包動態規劃
0 1揹包 問題描述 乙個旅行者有乙個最多能用 m公斤的揹包,現在有 n件物品,它們的重量 分別是w1,w2 wn,它們的價值分別為 c1,c2,cn.若每種物品只有一 件求旅行者能獲得最大總價值。輸入格式 w 第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 w第2.n 1 行...
0 1揹包(動態規劃)
題意 有n件物品和乙個容量為v的揹包。第i件物品的體積是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。基本思路 這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程...