1、B站视频链接:E16 背包DP 分组背包_哔哩哔哩_bilibili
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int v[N][N],w[N][N],s[N];
// v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数
int f[N][N];
// f[i,j]:前i组物品,能放入容量为j的背包的最大值
int main(){
int n,V;cin>>n>>V;
for(int i=1;i<=n;i++){
cin>>s[i];
for(int j=1;j<=s[i];j++){
cin>>v[i][j]>>w[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=V;j++){
for(int k=0;k<=s[i];k++){
if(j>=v[i][k]){
f[i][j]=max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
}
}
}
}
cout<<f[n][V];
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int f[N],v[N],w[N];
int main(){
int n,V,s;cin>>n>>V;
for(int i=1;i<=n;i++){
cin>>s;
for(int j=1;j<=s;j++){
cin>>v[j]>>w[j];
}
for(int j=V;j>=1;j--){
for(int k=0;k<=s;k++){
if(j>=v[k])f[j]=max(f[j],f[j-v[k]]+w[k]);
}
}
}
cout<<f[V];
return 0;
}
题目链接:通天之分组背包 - 洛谷
#include <bits/stdc++.h>
using namespace std;
const int N=33000;
int n,W,v,p,q;
int mw[N],mv[N],fw[N][3],fv[N][3];
int f[N];
int main(){
cin>>W>>n; //W总重量,n总个数
for(int i=1;i<=n;i++){
cin>>v>>p>>q;
if(!q){
mw[i]=v; //主件重量
mv[i]=v*p; //主件价值
}
else{
fw[q][0]++; //附件个数
fw[q][fw[q][0]]=v; //fw附件重量
fv[q][fw[q][0]]=v*p; //fv附件价值
}
}
for(int i=1;i<=n;i++) //物品
for(int j=W;j>=mw[i];j--){ //体积
f[j]=max(f[j],f[j-mw[i]]+mv[i]); //只选m
if(j>=mw[i]+fw[i][1]) //选m,a
f[j]=max(f[j],f[j-mw[i]-fw[i][1]]+mv[i]+fv[i][1]);
if(j>=mw[i]+fw[i][2]) //选m,b
f[j]=max(f[j],f[j-mw[i]-fw[i][2]]+mv[i]+fv[i][2]);
if(j>=mw[i]+fw[i][1]+fw[i][2]) //选m,a,b
f[j]=max(f[j],f[j-mw[i]-fw[i][1]-fw[i][2]]+mv[i]+fv[i][1]+fv[i][2]);
}
cout<<f[W];
}