最后一个点未过,不知道为什么,思路就是转化为01背包和完全背包两个dp就好了:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long h,m,hh,mm;
char ch;
long long n;
long long t[10010],c[10010],p[10010];
long long dp[10010];
long long t1[10010],c1[10010],p1[10010];
long long t2[10010],c2[10010],p2[10010];
long long cnt1, cnt2;
int main() {
cin >> h;
ch = getchar();
cin >> m >> hh;
ch = getchar();
cin >> mm >> n;
long long time = (hh - h)*60+(mm-m);
for(long long i = 1;i <= n;i++) {
cin >> t[i] >> c[i] >> p[i];
if(p[i] == 0) {
t2[++cnt2] = t[i];
c2[cnt2] = c[i];
p[cnt2] = p[i];
}
else {
if(p[i] == 1) {
t1[++cnt1] = t[i];
c1[cnt1] = c[i];
p1[cnt1] = p[i];
}
else {
bool f = false;
long long res = 0;
long long tt = p[i];
for(long long j = 1;j <= p[i];j*=2) {
if(tt-j < 0)
break;
t1[++cnt1] = t[i]*j;
c1[cnt1] = c[i]*j;
p1[cnt1] = j;
tt -= j;
}
if(tt) {
t1[++cnt1] = t[i] * tt;
c1[cnt1] = c[i] * tt;
p1[cnt1] = tt;
}
}
}
}
for(long long i = 1;i <= cnt1;i++) {
for(long long j = time;j >= t1[i];j--) {
dp[j] = max(dp[j],dp[j-t1[i]]+c1[i]);
}
}
for(long long i = 1;i <= cnt2;i++) {
for(long long j = t2[i];j <= time;j++) {
dp[j] = max(dp[j],dp[j-t2[i]]+c2[i]);
}
}
// cout << time << endl;
// for(long long i = 1;i <= cnt1;i++)
// cout << t1[i] << " " << c1[i] << " " << p1[i] << endl;
// for(long long i = 1;i <= cnt2;i++)
// cout << t2[i] << " " << c2[i] << " " << p2[i] << endl;
cout << dp[time];
return 0;
}