3741 倒水

 加油!我要达到国一水平!

//为了尽可能节约水,本题只有3种倒水方式:
//1、给当前客人倒水a毫升,使得总好感度增加b
//2、给当前客人倒水c毫升(c>a),使得总好感度增加d
//3、不给客人倒水(对应题目中的倒水小于a毫升,倒与不倒是一样的,还不如不倒),总好感度增加e 
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll dp[1005][1005];//dp[i][j]表示只考虑前i个客人,共倒水j毫升所得的最大好感度 
//易知对于第i个客人,给其倒水所得好感度的多少只与前i-1个客人有关 
//dp[i][j]表示只考虑前i个客人,共倒j毫升水所得到的最大好感度
int main()
{
    int N,M;
    cin>>N>>M;
    for(int i=1;i<=N;i++)
    {
      ll a,b,c,d,e;cin>>a>>b>>c>>d>>e;
      for(int j=0;j<=M;j++)
      {
        if(j<a) dp[i][j]=dp[i-1][j]+e;//如果水量少于a,不给倒水,满意度+e:
        else if(j>=a&&j<c) dp[i][j]=max(dp[i-1][j-a]+b,dp[i-1][j]+e);
        else dp[i][j]=max(dp[i-1][j-c]+d,max(dp[i-1][j-a]+b,dp[i-1][j]+e));        
      }
      //分情况讨论:
      //当水量小于a,不给倒水,这时候当前状态只是取决于前一个人j水量
      //a<x<c的时候,比较是不倒大还是到a大,水量也会相应变化
      //x>c,三种情况都会考虑,最后取最优解
    }
    cout<<dp[N][M]<<endl;//考虑前N个客人,共倒M毫升水所得好感度的最大值 即为最终答案 
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值