二进制拆分题...没什么好说的,证明看上篇博客/..
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5,M=3e5+4e4;
int t[N],c[N],p[N];
int id,n;
int T[M],val[M];
int f[1005];
inline void init()
{
for(int i=1;i<=n;i++)
{
int vnt=1;
while(true)
{
if(p[i]-vnt<0)
{
val[id]=c[i]*p[i];
T[id]=t[i]*p[i];
id++;
break;
}
else
{
p[i]-=vnt;
val[id]=c[i]*vnt;
T[id]=t[i]*vnt;
id++;
}
vnt*=2;
}
}
}
int main()
{
int ca,cb,cc,cd;
scanf("%d:%d%d:%d",&ca,&cb,&cc,&cd);
int v=(cc-ca)*60+(cd-cb);//背包容量
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&t[i],&c[i],&p[i]);
if(p[i]==0)
{
p[i]=1001;
}
p[i]=min(1001,p[i]);
}
init();
for(int i=0;i<id;i++)
{
for(int j=v;j>=T[i];j--)
{
f[j]=max(f[j],f[j-T[i]]+val[i]);
}
}
printf("%d\n",f[v]);
return 0;
}

京公网安备 11010502036488号