P1833 樱花

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;
}
posted @ 2022-01-07 16:47  HIVM  阅读(29)  评论(0编辑  收藏  举报