加油!我要达到国一水平!
//为了尽可能节约水,本题只有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;
}

1230

被折叠的 条评论
为什么被折叠?



