原题链接:P1802 5 倍经验日 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目思路:
01背包模板问题,
1. 对于药品足够的情况,需要考虑是否战胜对手与否,战胜则消耗所需的药品,得到相应胜利的经验值;失败则得到失败的经验值。
2. 对于药品不够的情况,则直接得到失败的经验值。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = 1e3 + 5;
int l[maxn], w[maxn], num[maxn];
int dp[maxn];
int main(int argc, char* argv[])
{
int n, x;
scanf("%d%d", &n, &x);
for (int i = 0; i < n; ++i) {
scanf("%d%d%d", &l[i], &w[i], &num[i]);
}
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; ++i) {
for (int j = x; j >= 0; --j) {
//药品足够
if (j >= num[i]) {
dp[j] = max(dp[j] + l[i], dp[j - num[i]] + w[i]);
}
//药品不够
else {
dp[j]+=l[i];
}
}
}
//根据题意,结果*5,需要用lld输出,否则最后的样例不会通过
printf("%lld\n", dp[x]*5);
return 0;
}