题目:
![](https://i-blog.csdnimg.cn/blog_migrate/97b8b336dda7cf3536657c43cc73452c.png)
思路:
普通背包问题,不过加了限制条件。
在普通背包问题中,
当背包容量小于物品容量时,我们选择不拿该物品,也就是数组dp[j]不变,但在这个问题中,dp[j]可以加上失败的经验,dp[j]=dp[j]+lose[i]
在这个问题中,
当背包容量小于物品容量时,dp[j]可以加上失败的经验,dp[j]=dp[j]+lose[i]
当背包容量大于等于物品容量时,我们可以选择失败(不消耗药)或成功。
dp[j] = max(dp[j]+lose[i], dp[j - uses[i]] + vin[i])
值得注意的是:
消耗0药物,也可能获胜;
数据尺寸较大;
代码
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int n, x;
int vin[1010], lose[1010],uses[1010];
long long dp[1010];
int main() {
cin >> n>>x;
for (int i = 1; i <= n; i++) {
cin >> lose[i] >> vin[i] >> uses[i];
}
for (int i = 1; i <= n; i++) {
for (int j = x; j >= 0; j--) {
if (j >= uses[i])
dp[j] = max(dp[j]+lose[i], dp[j - uses[i]] + vin[i]);
else
dp[j] += lose[i];
}
}
cout << dp[x] * 5;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/8512495a48336a7a29597a509b837a72.png)