题目描述
解法:组合背包
二进制分解
#include <bits/stdc++.h>
using namespace std;
int nx, ny, ex, ey, n, tp;
int t[10005], c[10005], p[10005];
int cost[1000005], value[100005];
int dp[1010];
void binary_split()
{
for(int i=1;i<=n;i++)
{
int k = 1;
while(p[i])
{
cost[++tp] = k*t[i];
value[tp] = k*c[i];
p[i] -= k;
k *= 2;
if(p[i]<k)
{
cost[++tp] = t[i]*p[i];
value[tp] = c[i]*p[i];
break;
}
}
}
}
int main()
{
scanf("%d:%d%d:%d%d",&nx,&ny,&ex,&ey,&n);
int ttime = (ex*60+ey)-(nx*60+ny);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&t[i],&c[i],&p[i]);
if(!p[i]) p[i] = 999999;
}
binary_split();
for(int i=1;i<=tp;i++)
for(int j=ttime;j>=cost[i];j--)
dp[j] = max(dp[j], dp[j-cost[i]]+value[i]);
printf("%d", dp[ttime]);
return 0;
}