1267:【例9.11】01揹包問題
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 12639 通過數: 7787
【題目描述】
一個旅行者有一個最多能裝 M 公斤的揹包,現在有 n 件物品,它們的重量分別是W1,W2,…,Wn,它們的價值分別爲C1,C2,…,Cn,求旅行者能獲得最大總價值。
【輸入】
第一行:兩個整數,M(揹包容量,M≤200)和N(物品數量,N≤30);
第2…N+1行:每行二個整數Wi,Ci,表示每個物品的重量和價值。
【輸出】
僅一行,一個數,表示最大總價值。
【輸入樣例】
10 4
2 1
3 3
4 5
7 9
【輸出樣例】
12
思路:一維01揹包模板
狀態計算:不選第i個物品和選第i個物品。
//一維01揹包模板
#include <iostream>
#include <cstdio>
using namespace std;
#define M 1000
int f[M], c[M], w[M];
int ans, v, m;
int main() {
scanf("%d%d", &v, &m);
for(int i = 1; i <= m; i++) scanf("%d%d", &c[i], &w[i]);
for(int i = 1; i <= m; i++)
for(int j = v; j >= c[i]; j--) {
f[j] = max(f[j], f[j-c[i]]+w[i]);
}
printf("%d\n", f[v]);
return 0;
}
解法二】設f[i][j]表示前i件物品,總重量不超過v的最優價值,
則f[i][j] = max(f[i-1][j], f[i-1][j-c[i]]+w[i]);f[m][v]即爲最優解。
//二維01揹包模板
#include <iostream>
#include <cstdio>
using namespace std;
#define M 1000
int f[M][M], ans;
int v, m, c[M], w[M];
int main() {
scanf("%d%d", &v, &m);
for(int i = 1; i <= m; i++) scanf("%d%d", &c[i], &w[i]);
for(int i = 1; i <= m; i++)
for(int j = 0; j <= v; j++) {
if(j >= c[i]) f[i][j] = max(f[i-1][j], f[i-1][j-c[i]]+w[i]);
else f[i][j] = f[i-1][j];
}
printf("%d\n", f[m][v]);
return 0;
}