求助
  • 板块灌水区
  • 楼主Bysq
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/5/18 20:59
  • 上次更新2023/10/23 15:24:45
查看原帖
求助
985034
Bysq楼主2023/5/18 20:59

众所周知,三水喜欢吃莲蓉蛋黄馅的月饼。这天,三水的好朋友送给三水一箱礼物,里面有 nn 个月饼,每个月饼都有三个属性:进食时间 tt,过期时间 bb,快乐值 hh。

因为每个月饼大小不一,所以吃每个月饼花费的时间都不同,对于月饼 ii , 需要 t_it i ​ 的时间才能吃完。每个月饼都有其保质期,月饼 ii 会在 b_ib i ​ 时刻过期。此外,每个月饼的馅也不尽相同,吃完月饼 ii 能给三水带来 h_ih i ​ 的快乐(莲蓉蛋黄馅当然是满分)。

需要说明的是,三水不会吃过期的月饼,更不希望月饼在被吃的过程中过期。但是如果这个月饼恰好在被吃完的时刻过期,那么这个月饼仍然可以给三水带来快乐。

三水是一个环保主义者,他不希望 看到 任何一个月饼过期。所以三水可以在任意时刻结束进餐,并且立刻离开餐厅(离开餐厅之后三水就不会回来了)。在他结束进餐时,三水必须吃完所有在 当前时刻及其之前 过期的月饼。这样,三水就不会 看到 还没被吃掉的月饼过期了。因为三水下午还有课,所以最多花费 TT 时间进餐。现在三水想知道,在满足上述条件的情况下,最多能得到多少快乐。

三水当然知道该怎么算啦,但还是希望你帮他算一算。```cpp #include #include #include #include

using namespace std;

struct MoonCake{ int t;//需要的时间 int b;//保质日期 int h;//快乐值 };

bool cmp(MoonCake &a, MoonCake &b){ return a.b<b.b; }//将保质期按照从早到晚排序

int main(){ int n,T;//个数,时间 while(cin>>n>>T){ vector mooncake(n); for(int i=0;i<n;i++){ cin>>mooncake[i].t>>mooncake[i].b>>mooncake[i].h; }//输入tbh sort(mooncake.begin(), mooncake.end(), cmp);//按保质期递从早到晚 vector<vector > dp(n+1, vector(T+1, 0)); for(int i=1;i<=n;i++){ for(int j=1;j<=T;j++){ dp[i][j] = dp[i - 1][j];//不吃当前月饼 if(j>=mooncake[i-1].b&&(j+mooncake[i-1].t<=T)){ dp[i][j]=max(dp[i][j],dp[i-1][j-mooncake[i-1].t]+mooncake[i-1].h); }//如果在当前时间吃的时候还未过期,且吃的过程不过期 } } cout<<dp[n][T]<<endl; } return 0; }

求助大佬,怎么完善该代码
2023/5/18 20:59
加载中...