多重背包(单调队列优化版)

#include
#include
#include

using namespace std;

int n, m;

const int N = 200010;
int f[N], g[N], q[N];

int main()
{
     
    cin >> n >> m;
    for(int i = 0 ;i < n ; i ++)
    {
     
        int v, w, s;scanf("%d %d %d", &v, &w, &s);
        memcpy(g, f, sizeof f);
        for(int j = 0; j < v; j ++)
        {
     
            int hh = 0, tt = -1;
            for(int k = j; k <= m ; k += v)
            {
     
                while(tt >= hh && k - s * v > q[hh]) hh ++;
                if(tt >= hh) f[k] = max(f[k], g[q[hh]] + (k - q[hh]) / v * w);
                while(tt >= hh && g[k] - (k - q[hh])/ v * w >= g[q[tt]]) tt --;
                q[++ tt] = k;
            }
        }
    }
    cout << f[m];
    return 0;
}

你可能感兴趣的:(多重背包(单调队列优化版))