第九章 动态规划-第二节 背包问题-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 
#include 
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 
#include 
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;
}

你可能感兴趣的:(信息学C++,一本通)