!-- Loading 底层遮罩 -->

P1833 樱花

传送门

思路

混合背包模板+二进制优化。

代码

#include<iostream>
#define MAXN 10007
using namespace std;
int v[MAXN], w[MAXN], num[MAXN], n, T, cnt, dp[MAXN];
int main(void)
{
    int h1 = 0, h2 = 0, m1 = 0, m2 = 0;
    char ch;
    cin >> h1 >> ch >> m1;
    cin >> h2 >> ch >> m2;
    cin >> n;
    T = h2 * 60 + m2 - h1 * 60 - m1;
    for (int i = 1; i <= n; i++)
        cin >> w[i] >> v[i] >> num[i];
    for (int i = 1; i <= n; i++)
    {
        if (num[i] == 0) {
            for (int j = w[i]; j <= T; j++)
                dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
        }
        else {
            int count = 1;
            while (num[i] > count) {
                for (int j = T; j >= count * w[i]; j--)
                    dp[j] = max(dp[j], dp[j - count * w[i]] + v[i] * count);
                num[i] -= count;
                count = 2;
            }
            for (int j = T; j >= num[i] * w[i]; j--)
                dp[j] = max(dp[j], dp[j - num[i] * w[i]] + v[i] * num[i]);
        }
    }
    cout << dp[T];
    return 0;
}
 

 

posted @ 2022-03-30 20:40  Thinker-X  阅读(47)  评论(0)    收藏  举报