https://www.luogu.org/problemnew/show/P1776
单调队列+多重背包的讲解https://www.cnblogs.com/JoeFan/p/4165956.html https://blog.csdn.net/flyinghearts/article/details/5898183
#include<iostream>
#include<algorithm>
#include<deque>
using namespace std;
int n,V;
int ans=,dp[];
deque<int> q2,q;
int main(){
cin>>n>>V;
for(int o=;o<n;o++){
int w,v,c;
cin>>w>>v>>c;
if(v==){
ans+=w*c;
continue;
}
int k=V/v;
c=min(c,k);
for(int d=;d<v;d++){
q.clear();
q2.clear();
k=(V-d)/v;
for(int j=;j<=k;j++){
while(!q.empty()&&dp[j*v+d]-j*w>=q2.back()){
q2.pop_back();
q.pop_back();
}
q.push_back(j);
q2.push_back(dp[j*v+d]-j*w);
while(!q.empty()&&q.front()+c<j){
q.pop_front();
q2.pop_front();
} dp[d+j*v]=max(dp[d+j*v],q2.front()+j*w);
}
}
}
cout<<ans+dp[V];
return ;
}