AcWing 6. 多重背包问题 III
原题链接
困难
作者:
minux
,
2020-05-09 09:28:40
,
所有人可见
,
阅读 549
#include <bits/stdc++.h>
using namespace std;
const int N=20005;
int n,m;
int f[N], g[N], q[N];
int main(){
cin>>n>>m;
for(int i=0; i<n; ++i){
int v, w, s;
cin>>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){
if(hh<=tt && q[hh]<k-s*v) ++hh;
if(hh<=tt) f[k]=max(f[k], g[q[hh]]+(k-q[hh])/v*w);
while(hh<=tt && g[q[tt]]-(q[tt]-j)/v*w<=g[k]-(k-j)/v*w) tt--;
q[++tt]=k;
}
}
}
cout<<f[m]<<endl;
return 0;
}