P1802 5倍经验日

发布时间 2023-08-22 23:58:28作者: 失控D大白兔

有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;
}