9. 分组背包问题
题目链接https://www.acwing.com/problem/content/description/9/
题目:
方法一:没有优化内存的做法,二维。思路就是拿每一个小组每一个物品来比较,但要做两次比较。第一次就是和f[ k-1 ][ j ],第二次就是和f[k][j]。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int f[110][110],k=1;
int main(){
int n,v;
cin>>n>>v;
for(int i=0;i<n;i++){
int s,x,y;
scanf("%d",&s);
for(int j=1;j<=s;j++){
scanf("%d%d",&x,&y);
for(int z=v;z>=0;z--){
f[k][z]=max(f[k][z],f[k-1][z]);
if(z>=x)
f[k][z]=max(f[k][z],f[k-1][z-x]+y);
}
}
k++;
}
cout<<f[k-1][v];
return 0;
}
方法二:优化了f,变成一维。思路就是,拿每一组在某个v里面进行比较,取最优值
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int f[110],v[110][110],w[110][110],s[110];
int main(){
int n,m;
cin>>n>>m;
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=m;j>=0;j--){
for(int z=1;z<=s[i];z++){
if(j>=v[i][z])
f[j]=max(f[j],f[j-v[i][z]]+w[i][z]);
}
}
}
cout<<f[m];
return 0;
}