0/1揹包
【問題描述】
乙個旅行者有乙個最多能用
m公斤的揹包,現在有
n件物品,它們的重量
分別是w1,w2
,...,wn,
它們的價值分別為
c1,c2,...,cn.
若每種物品只有一
件求旅行者能獲得最大總價值。
【輸入格式】 w
第一行:兩個整數,
m(揹包容量,
m<=200)和n(
物品數量,
n<=30);
w第2..n+1
行:每行二個整數
wi,ci
,表示每個物品的重量和價值。
【輸出格式】 w
僅一行,乙個數,表示最大總價值。
【樣例輸入】
package.in w
10 4 w
21
w33 w
45
w79
【樣例輸出】
package.out w
12
啊終於到了揹包問題了【淚流滿面啊該來的還是會來】
揹包問題屬於動態規劃,所以 我們用動態規劃來解決最基礎的01揹包問題
首先用f[i][v]表示前i件物品,總重不大於v時的最優解。對於第i件物品,我們可以選擇加上i或者不加上i,如果不加i為最優解的話,那f[i][v]=f[i-1][v]。如果加上i,那麼要考慮此時c[i]要加上的最優解,應當是f[i-1][v-w[i]],這樣才能保證,當加上i物品時,總重仍然不超過v,即
f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i])
其中v應從m開始迴圈至1,同時要注意v-w[i]>0,否則的話負數會掛(╰_╯)#
附上程式
#include#include#includeusing namespace std;
int m,n,w[31],c[31],f[31][201];
int max(int a,int b)
int main()
printf("%d",f[n][m]);
return 0;
}
揹包是個大坑o(︶︿︶)o唉
動態規劃 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...
0 1揹包(動態規劃)
題意 有n件物品和乙個容量為v的揹包。第i件物品的體積是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。基本思路 這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程...
動態規劃01揹包
01揹包問題簡介 詳細說明 狀態轉移方程詳解 舉例 塊 測試結果 0 1揹包問題 給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?在選擇裝入揹包的物品時,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能將...