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 200int 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件物品,我們只考慮是否要...