#include<bits/stdc++.h>
using namespace std;
int n,W,w[40010],m[40010],v[40010],ans,anss,q[40010],num[40010],dp[40010];
signed main() {
cin>>n>>W;
for(int i=1;i<=n;i++)
scanf("%d%d%d",&v[i],&w[i],&m[i]);
for(int i=1;i<=n;i++) {
if(w[i]==0) {
anss+=v[i]*m[i];
continue ;
}
int cu=min(m[i],W/w[i]);//每件物品最多能拿多少
for(int d=0;d<w[i];d++) {//模数为多少
int h=1,t=0;
for(int k=0;k<=(W-d)/w[i];k++) {
int nw=dp[d+k*w[i]]-v[i]*k;
while(h<t&&num[h]+cu<k) h++;
dp[d+k*w[i]]=max(dp[d+k*w[i]],q[h]+k*v[i]);
ans=max(ans,dp[d+k*w[i]]);
while(h<=t&&q[t]<=nw) t--;//维持单调性
q[++t]=nw,num[t]=k;
}
for(int k=1;k<=t;k++) q[k]=0;
}
}
cout<<anss+ans;
return 0;
}
蒟蒻不是很清楚
while(h<t&&num[h]+cu<k) h++;
请问大佬们这里 d+k×wi 是否会因为 numh 中已经选了一些数而超出数量限制