P1802 5倍经验日
2024年9月28日大约 2 分钟
P1802 5倍经验日
题目背景
现在乐斗有活动了!每打一个人可以获得 5 倍经验!absi2011 却无奈的看着那一些比他等级高的好友,想着能否把他们干掉。干掉能拿不少经验的。
题目描述
现在 absi2011 拿出了
由于迷你装药物每个只能用一次,所以 absi2011 要谨慎的使用这些药。悲剧的是,用药量没达到最少打败该人所需的属性药药量,则打这个人必输。例如他用
现在有
要求求出最大经验
输入格式
第一行两个数,
后面
输出格式
一个整数,最多获得的经验的五倍。
提示
【Hint】
五倍经验活动的时候,absi2011 总是吃体力药水而不是这种属性药。
【数据范围】
- 对于
的数据,保证 。 - 对于
的数据,保证 , 。 - 对于
的数据,保证 , , 。 - 对于
的数据,保证 , , 。
题目思路
01背包变形,但是0也有收益
dp[i][j]为i个人j瓶药时的最大收益 显然有
dp[i][j] = max({
dp[i - 1][j] + lose[i], // 打不过,一瓶药都不磕
dp[i - 1][j - c[i]] + win[i]
})题解
#include <iostream>
using namespace std;
long long dp[1024][1024] = {0}; // 这题会爆int
struct person
{
int c;
int lose;
int win;
};
person ps[1024];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, x;
cin >> n >> x;
int lose, win, c;
for (int i = 1; i <= n; i++)
{
cin >> lose >> win >> c;
ps[i] = {c, lose, win};
}
for (int j = 0; j <= x; j++)
{
dp[0][j] = 0; // 0人收益为0
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= x; j++)
{
dp[i][j] = dp[i - 1][j] + ps[i].lose;
if (j >= ps[i].c)
{
dp[i][j] = max(dp[i][j], dp[i - 1][j - ps[i].c] + ps[i].win);
}
}
}
cout << dp[n][x] * 5;
return 0;
}