目录
一:前言
既然背包类型的问题都讲完了,那么自然少不了整合。
二:代码链接
1:01背包
2:完全背包
完全背包问题二维和优化_yyf525的博客-CSDN博客_二维完全背包问题
3:多重背包
4:分组背包
三:背包问题的重点
1:01背包
最终优化结果
一维+双循环,
循环
从大到小循环
for(int i=1;i<=n;i++){
for(int j=m;j>=v[i];j--){
}
}
公式
f[j]=max(f[j],f[j-v[i]]+w[i]);
2:完全背包
最终优化结果
一维+双循环,
循环
从小到大循环
for(int i=1;i<=n;i++){
for(int j=v[i];j<=m;j++){
}
}
公式
f[j]=max(f[j],f[j-v[i]]+w[i]);
3:多重背包
最终优化结果
先用二进制转换,让多重背包变成01背包的形式来解决。
二进制转换
int n,m,cnt=0;
cin>>n>>m;
for(int i=0;i<n;i++){
int a,b,c;
cin>>a>>b>>c;
int k=1;
while(k<=c){
cnt++;
v[cnt]=k*a;
w[cnt]=k*b;
c-=k;
k*=2;
}
if(c>0){
cnt++;
v[cnt]=c*a;
w[cnt]=c*b;
}
}
n=cnt;
01解决
for(int i=1;i<=n;i++){
for(int j=m;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m];
4:分组背包
最终优化结果
一维+三循环
中心部分
for(int i=1;i<=n;i++){
for(int j=m;j>=0;j--){//我们这里要从大到小,因为我们要用到前面的数据。防止出错
for(int k=0;k<=s[i];k++)
if(v[i][k]<=j)
f[j]=max(f[j],f[j-v[i][k]]+w[i][k]);
}
}
cout<<f[m];
四:结语
背包其实就是动态规划,动态规划简称DP,就是把每次的最优解用一个数组来存放,每次根据上一次的最优解选出这一次的最优解,主要是公式和优化比较难,希望大家可以掌握哦~~~