揹包問題學習筆記

2022-05-16 04:04:35 字數 1436 閱讀 7744

01揹包問題

題目描述

乙個人有乙個最大裝載質量為m的揹包。現在有n件物品,它們的質量分別是w1,w2,…,wn,它們的價值分別為c1,c2,…,cn。

若每種物品只有一件,求這個人的揹包所能裝載的最大價值。

輸入格式

第一行兩個整數m,n,如題中所述。

第2行到第n+1行每行二個整數wi,ci,表示每個物品的重量和價值,如題中所敘述。

輸出格式

僅一行,為最大的價值。

輸入樣例

10 4

2 13 3

4 57 9

輸出樣例

12資料範圍

m<=200,n<=30

求解

宣告乙個陣列f[j]為總重不超過j的揹包的最大價值。於是得到了遞推式:

f[j]=max(f[j],f[j-w[i]]+c[i]),j>=w[i];

然後大概就是這樣推出來的?蒟蒻講不清楚啊emmmmm直接上**吧orz

下面是簡單易懂無優化的**:

#include #define max_m 200

int n,m,f[max_m+5]; //

f[i] 儲存當揹包裝載質量為i時的最大價值

int max(int x,int

y)int

main()

printf("%d

",f[m]); //

沒有要求恰好放滿,所以任何f[i]都是合法的初始狀態,最大的方案一定會落在f[i]中

}

再觀察下資料範圍,可以略微優化。

下面是正式**,加了讀入優化,因為資料範圍不大就把int改成short了(但是理論上不行的,誰叫這道題資料太水呢嘻嘻嘻)

#include #define reg register

#define max_m 200

short f[max_m+5

];

inline

short max(reg short x,reg short

y)inline

short

read()

while (ch>='

0'&&ch<='9'

) return x*f;

}int

main()

printf(

"%hd

",f[m]);

return0;

}

[參考《挑戰程式設計》第二版及網上資料]

揹包問題學習筆記

有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。從這個題目中可以看出,01揹包的特點就是 每種物品僅有一件,可以選擇放或不放。01揹包問題的狀態轉移方程是 f i v max其中,即fi表示前i件物品恰放入乙個容量為v的揹包可以獲得的最...

學習筆記 揹包問題

有 n 件物品和乙個容量為 v 的揹包.第 i 件物品體積為 c i 價值為 w i 求揹包最大價值.f i j 表示前 i 種物品體積為 j 的最大價值,f i j max f i 1 j f i 1 j c i w i 時間複雜度 o vn f j 表示體積為 j 的最大價值,f j max f...

揹包問題學習筆記(1)

一方面學習揹包九講 這個十分清晰,重點標記清楚。但有些需要自己理解的和重點的,我做了如下筆記,方便別人理解,也方便自己複習,如有錯誤,歡迎指正。狀態函式f i v 表示 前i件物品放入容量為v的揹包可獲得的最大價值 狀態遷移方程f i v max考慮下為什麼是這樣的,對於第i件物品,我們只考慮是否要...