P1802 5倍经验日
有x个药物和n个敌人
战胜第i敌人可以获得win[i]的经验值,失败可以获得lose[i]经验值,要想战胜第i个敌人,需要使用c[i]个药物
求可以获得的最大经验值
1. 动态规划
有点类似分组背包,失败需要0个药物,战胜或输给同一个敌人不能同时发生,属于同一组
但该题战胜敌人可能使用0个药物,所以不能直接更新迭代,避免同时出现
void maxval(int V,vector<int>&lose,vector<int>&win,vector<int>&c){
int n = c.size();
vector<long long> dp(V+1);//dp[i]最大经验值
long long res = 0;
for(int i=0;i<n;i++)
for(int j=V;j>=0;j--){
if(j>=c[i])
dp[j] = max(dp[j]+lose[i],dp[j-c[i]]+win[i]); //做选择
else
dp[j] = max(dp[j],dp[j]+lose[i]); //不消耗药水
res = max(res,dp[j]);
}
cout<<res*5;
return;
}