题解
2026-05-19 19:45:56
发布于:浙江
7阅读
0回复
0点赞
大家好,我是энтджей,今天是我2026年第十次正式发题解!
本来想着说先把代码晒在这里,第二天来写,结果直接下架了,那就直接重写吧
能不能点个赞
类似题目传送门
类似题目传送门
首先简化题意:
- 大致就是先告诉你可利用时间,然后告诉你花费的时间、获得的价值、可观看次数,然后做背包问题
然后就是写代码
-
处理输入(read):
- 其实就是计算可利用时间比较难:
- 可以按 ShSymbalSm EhSymbalEm 来输入 Symbal表示“:”
- 计算时间其实就是 (eh - sh) * 60 + em - sm
- 其余正常输入
- 其实就是计算可利用时间比较难:
-
核心部分(process):
- 可以把可以无限参观的看做完全背包,把其他的看做多重01背包
- 然后按公式计算
- 即:
- 即:
-
最后输入最大时间(write):
- 输出dp的第可利用时间项
完整代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e4 + 10;
int CanUseTime; // 还有多久上学
int n; // 樱花棵树
int t[N],c[N],p[N]; // 记录 耗费的时间 美学值 可参观次数
int dp[N]; // 背包问题(优化后)dp数组
void read(){ //输入
int sh,sm,eh,em; //用于记录开始时间以及结束时间
char symbal; //用于输入:
cin >> sh >> symbal >> sm >> eh >> symbal >> em;
CanUseTime = (eh - sh) * 60 + em - sm; //处理一共还有多久的上学时间
cin >> n;
for(int i = 1;i <= n; i++){
cin >> t[i] >> c[i] >> p[i]; //输入Ti Ci Pi
}
}
void process(){ //处理
for(int i = 1; i <= n; i++) {
if(p[i] == 0) { //无限次观看 —— 完全背包
for(int j = t[i]; j <= CanUseTime; j++) {
dp[j] = max(dp[j], dp[j - t[i]] + c[i]); //dp状态转移
}
} else { //有限次参观 —— 01背包
for(int step = 1; step <= p[i]; step++){
for(int j = CanUseTime; j >= t[i]; j--){
dp[j] = max(dp[j], dp[j - t[i]] + c[i]); //dp状态转移
}
}
}
}
}
void write(){ //输出
cout << dp[CanUseTime];
}
signed main(){
ios::sync_with_stdio(false); //加速输入输出
cin.tie(0),cout.tie(0); //进一步加速
//全过程:
read();
process();
write();
return 0;
}
🎉完结撒花🎉
这里空空如也





有帮助,赞一个