【入门】完全背包
题目描述
有 种物品和一个容量是 的背包,每种物品都有无限件可用。
第 种物品的体积是 ,价值是 。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。
输入格式
第一行两个整数,,用空格隔开,分别表示物品数量和背包容积。
接下来有 行,每行两个整数 ,用空格隔开,分别表示第 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
4 5
1 2
2 4
3 4
4 5
10
提示
【样例解释 1】
- 可以选择 1 个物品1 和 2 个物品2
- 总体积为:1 * 1 + 2 * 2 = 5
- 总价值为:1 * 2 + 2 * 4 = 10
请同学们完善下面的代码(记忆化搜索)
int n, m;
int v[N], w[N];
int dp[N][M]; // dp[i][j]: 前 i 个物品, 体积不超过 j 的最大价值
// 前 i 个物品, 体积不超过 j 的最大价值
int solve(int i, int j) {
// 终止条件
if (dp[i][j] >= 0) return dp[i][j];
// 分解为规模更小的问题
dp[i][j] = 0;
// 第一种情况:用了第 i 个物品,这里和 01背包 稍有不同!!
// 可以试试枚举第 i 个物品用了多少个
// 或者有没有更简洁的方法
// 第二种情况:没用第 i 个物品
return dp[i][j];
}
for (int i = 1; i <= n; i++) for (int j = 0; j <= m; j++) dp[i][j] = -1;
请思考后再点击查看提示
- 状态设计: 表示从前 个物品中选出体积不超过 的物品时的最大价值
- 状态转移
- 注意,当使用使用第 个物品时
- ,01背包
- ,完全背包