1、B站视频链接:E14 背包DP 混合背包_哔哩哔哩_bilibili
#include <bits/stdc++.h>
using namespace std;
const int N=1010,M=10000;
int a[M],b[M],c[M];//体积、价值、类型
int f[N];int main(){int n,m,v,w,s;cin>>n>>m;int num=1;for(int i=1;i<=n;i++){scanf("%d%d%d",&v,&w,&s);if(s==0){//完全背包 a[num]=v;b[num]=w;c[num++]=0;//背包类型 }else{if(s==-1){s=1;}int j=1;int k=1;while(s>=k){a[num]=k*v;b[num]=k*w;c[num++]=1;s-=k;k<<=1;}if(s){a[num]=s*v;b[num]=s*w;c[num++]=1;}}}for(int i=1;i<num;i++){if(c[i]==1){for(int j=m;j>=a[i];j--){f[j]=max(f[j],f[j-a[i]]+b[i]);}}else{for(int j=a[i];j<=m;j++){f[j]=max(f[j],f[j-a[i]]+b[i]);}}}cout<<f[m];return 0;
}
#include <bits/stdc++.h>
using namespace std;
int f[1010],g[1010];
int n,m;
int q[1010];void ZeroOnePack(int v,int w){for(int j=m;j<=v;j--){f[j]=max(f[j],f[j-v]+w);}
}
void CompletePack(int v,int w){for(int j=v;j<=m;j++){f[j]=max(f[j],f[j-v]+w);}
}
void MultiplePack(int v,int w,int s){memcpy(g,f,sizeof(f));for(int j=0;j<v;j++){int h=0,t=-1;for(int k=j;k<=m;k+=v){if(h<=t&&q[k]<k-s*v)h++;if(h<=t)f[k]=max(g[k],g[q[h]]+(k-q[h])/v*w);while(h<=t&&g[k]>=g[q[t]]+(k-q[t])/v*w)t--;q[++t]=k;}}
}
int main(){int v,w,s;cin>>n>>m;for(int i=1;i<=n;i++){scanf("%d %d %d",&v,&w,&s);if(s==-1){ZeroOnePack(v,w);}else if(s==0){CompletePack(v,w);}else{MultiplePack(v,w,s);}}cout<<f[m];return 0;
}