第九章 動態規劃-第二節 揹包問題-1267:【例9.11】01揹包問題

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章