大致思路是直接类似完全背包的正向循环,然后记录多一个使用次数的状态,不超过就可以继续选。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int ts,te,n,dp[10000005],t[10000005],c[10000005],p[10000005],rec[10000005];
int main()
{
int s1,s2,t1,t2;
scanf("%d:%d %d:%d %d",&s1,&s2,&t1,&t2,&n);
ts=s1*60+s2;te=t1*60+t2;
int limit=te-ts;
for (int i=1;i<=n;i++)
scanf("%d%d%d",&t[i],&c[i],&p[i]);
for (int i=1;i<=n;i++)
{
for (int j=0;j<=limit;j++) rec[j]=0;
if (p[i]==0) p[i]=0x3f3f3f3f;
for (int j=t[i];j<=limit;j++)
{
if (rec[j-t[i]]<p[i])
{
if (dp[j-t[i]]+c[i]>dp[j])
{
dp[j]=dp[j-t[i]]+c[i];
rec[j]=rec[j-t[i]]+1;
}
}
}
}
printf("%d",dp[limit]);
return 0;
}