题目:https://www.acwing.com/problem/
分组背包问题描述是共有n组物品,每组物品你只能选一个,求最大价值
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=110; 6 struct node 7 { 8 int v,w; 9 }; 10 node wp[N]; 11 int n,m; 12 int f[N]; 13 int main(void) 14 { 15 cin>>n>>m; 16 for(int i=1;i<=n;i++) 17 { 18 int s; 19 cin>>s; 20 for(int j=1;j<=s;j++) 21 { 22 cin>>wp[j].v>>wp[j].w; 23 } 24 for(int j=m;j>=0;j--)//枚举体积,先枚举体积才能保证同组物品不可能被选多次,至于枚举方法应该是同01背包的,因为只有一个 25 { 26 for(int k=1;k<=s;k++)//枚举每个物品 27 { 28 if(j-wp[k].v>=0) 29 { 30 f[j]=max(f[j],f[j-wp[k].v]+wp[k].w); 31 } 32 } 33 } 34 } 35 cout<<f[m]; 36 return 0; 37 }
二位费用背包也是个比较简单的问题,主要就是将01背包中的体积换为重量和体积两个参数
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=110; 6 int n,V,M; 7 int f[N][N]; 8 int main(void) 9 { 10 cin>>n>>V>>M; 11 for(int i=1;i<=n;i++) 12 { 13 int v,m,w; 14 cin>>v>>m>>w; 15 for(int j=V;j>=v;j--) 16 { 17 for(int k=M;k>=m;k--) 18 { 19 if(j-v>=0&&k-m>=0) 20 { 21 f[j][k]=max(f[j][k],f[j-v][k-m]+w); 22 } 23 } 24 } 25 } 26 cout<<f[V][M]; 27 return 0; 28 }