代码如下
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
vector<int> w, v;
int W, n, dp[100010];
bool mark[101000];
int main()
{
int t1, t2, t3, t4;
scanf("%d:%d %d:%d %d", &t1, &t2, &t3, &t4, &n);
W = t3 * 60 + t4 - t1 * 60 - t2;
int wt, vt, nt, cnt;
for (int i = 0; i < n; i++)
{
scanf("%d %d %d", &wt, &vt, &nt);
if (nt)
{
int c = 1;
while (nt - c > 0)
{
nt -= c;
w.push_back(c * wt);
v.push_back(c * vt);
c <<= 1;
cnt++;
}
w.push_back(nt * wt);
v.push_back(nt * vt);
cnt++;
}
else
{
mark[cnt] = true;
w.push_back(wt);
v.push_back(vt);
cnt++;
}
}
for (int i = 0; i < cnt; i++)
{
if (!mark[i])
{
for (int j = W; j >= w[i]; j--)
{
dp[j] = dp[j] > dp[j - w[i]] + v[i] ? dp[j] : dp[j - w[i]] + v[i];
}
}
else
{
for (int j = 0; j <= W - w[i]; j++)
{
dp[j + w[i]] = dp[j + w[i]] > dp[j] + v[i] ? dp[j + w[i]] : dp[j] + v[i];
}
}
}
printf("%d\n", dp[W]);
return 0;
}