题目:
小蓝面前有 N 件物品,其中第 i 件重量是 Wi,价值是 Vi。她还有一个背包,最大承重是 M。
小蓝想知道在背包称重范围内,她最多能装总价值多少的物品?
特别值得一提的是,小蓝可以使用一个魔法,将一件物品的重量增加 K,同时价值翻倍。(当然小蓝也可以不使用魔法)
输入:
第一行包含 3 个整数 N、M 和 K。
以下 N 行,每行两个整数 Wi 和 Vi。
输出:
一个整数代表答案。
![](https://i-blog.csdnimg.cn/blog_migrate/4180b7c51d15dac5b70bb7cd9e6cce38.png)
思路:
![](https://i-blog.csdnimg.cn/blog_migrate/6b7e508ebdc1df7f9348d093e70802eb.png)
代码:
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int n, m,k;
int weight[2020], value[2020];
int dp[10010][2];
int main() {
cin >> n >> m>>k;
for (int i = 1; i <= n; i++) {
cin >> weight[i] >> value[i];
}
for (int i = 1; i <= n; i++) {
for (int j = m; j >= weight[i]; j--) {
dp[j][0] = max(dp[j][0], dp[j - weight[i]][0] + value[i]);
if (j >= weight[i] + k) {
dp[j][1] = max(dp[j][1], dp[j - weight[i] - k][0] + value[i] * 2);
dp[j][1] = max(dp[j][1], dp[j - weight[i]][1] + value[i]);
}
}
}
cout << max(dp[m][0],dp[m][1]);
return 0;
}
54分