洛谷P1802 5 倍经验日 题解
本题做法
- 0/1 背包 DP。
思路
这题我们会发现,用不用药给第 \(i\) 个人,都有相应的价值,这种情况我们可以将每个人的输的情况的经验设为一个“基准数”,然后将赢的情况的经验减去输的情况的经验得到赢了之后多得到的经验。然后就可以按照正常的 0/1 背包 DP 问题去做了。
注意:最后要把输的经验全部加回来并×5!
代码
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int N=1005;
struct enemy{
ll win,lose,need;
} a[N];
ll n,x,dp[N],sumlose;
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++) {
cin>>a[i].lose>>a[i].win>>a[i].need;
sumlose+=a[i].lose;
a[i].win-=a[i].lose;
}
for(int i=1;i<=n;i++){
for(int j=x;j>=a[i].need;j--){
dp[j]=max(dp[j],dp[j-a[i].need]+a[i].win);
}
}
cout<<(dp[x]+sumlose)*5;
return 0;
}