#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int> v;
vector<int> w;
int dp[40005],maxn[40005];
int p,n,m,a,b,c,ans,f;
signed main(){
cin>>n>>m;
v.push_back(1e9);
w.push_back(1e9);
for(int i=1;i<=n;i++){
cin>>a>>b>>c;
while(c--){
v.push_back(a);
w.push_back(b);
}
}
n=v.size()-1;
for(int i=1;i<=n;i++){
if(f&&v[i]==v[i-1]&&w[i]==w[i-1]) continue;
f=1;
for(int j=m;j>=w[i];j--){
if(dp[j-w[i]]+v[i]>dp[j]){
f=0;
dp[j]=dp[j-w[i]]+v[i];
}
}
}
for(int i=1;i<=m;i++) ans=max(ans,dp[i]);
cout<<ans;
return 0;
}
O(玄学) 时间复杂度的代码过了。
理论上可以造出一组每个物品都能更新答案的数据,能把此代码卡退化到 O(W∑mi)。