P1833 樱花
混合背包问题,可以全部转化为多重背包,也可以分类讨论。
下面利用多重背包,二进制分组优化。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<int> w,v;
int dp[1002];
signed main()
{
int ts1,ts2,ts,te1,te2,te,t;
scanf("%d:%d",&ts1,&ts2);ts = ts1 * 60 + ts2;
scanf("%d:%d",&te1,&te2);te = te1 * 60 + te2;
t = te - ts;
int n; scanf("%d",&n);
for(int i=1;i<=n;++i)
{
int ti,ci,pi;
scanf("%d %d %d",&ti,&ci,&pi);
if(pi==0) pi = 1000;
int c = 1,l = 1;
while(pi-l>0)
{
w.push_back(ti*c);
v.push_back(ci*c);
c <<= 1;
l += c;
}
c = pi - (l - c);
w.push_back(ti*c);
v.push_back(ci*c);
}
int len = v.size();
for(int i=0;i<len;++i)
{
for(int j=t;j>=w[i];--j)
dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
}
printf("%d\n",dp[t]);
return 0;
}