当前位置: 首页 > news >正文

背包DP合集

01背包

介绍:

01背包是处理当前有限的物品中,选择固定的体积可以获得出的价值最大的问题

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){int m,n;while(cin>>m>>n){if(m==0&&n==0)break;vector<pair<int,int>>a(n+1);for(int i=1;i<=n;i++)cin>>a[i].first>>a[i].second;vector dp(n+1,vector<int>(m+1));//表示到第i个位置为止,占用了j的体积的总价值最大是多少for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(j>=a[i].first)dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i].first]+a[i].second);else dp[i][j]=dp[i-1][j];}}cout<<dp[n][m]<<'\n';}
}

空间优化:

滚动数组优化:

可以发现它的转移与前面的一行的状态有关,所以可以只维护两行数组即可
请添加图片描述

代码:
#include<bits/stdc++.h>
using namespace std;
int main(){int m,n;while(cin>>m>>n){if(m==0&&n==0)break;vector<pair<int,int>>a(n+1);for(int i=1;i<=n;i++)cin>>a[i].first>>a[i].second;vector dp(2,vector<int>(m+1));for(int i=1;i<=n;i++){int y=i&1;for(int j=1;j<=m;j++){if(j>=a[i].first)dp[y][j]=max(dp[y^1][j],dp[y^1][j-a[i].first]+a[i].second);else dp[y][j]=dp[y^1][j];}}cout<<dp[n&1][m]<<'\n';}
}

优化为一维:

可以发现当前转移是根据前面的转移的,想想是否可以将其压缩为一维,因为每一个数都是根据前面的数转移的,所以需要维护前面的数不被改变,可以从后往前开始遍历
请添加图片描述

代码:
#include<bits/stdc++.h>
using namespace std;
int main(){int m,n;while(cin>>m>>n){if(m==0&&n==0)break;vector<pair<int,int>>a(n+1);for(int i=1;i<=n;i++)cin>>a[i].first>>a[i].second;vector<int>dp(m+1);for(int i=1;i<=n;i++){for(int j=m;j>=a[i].first;j--){dp[j]=max(dp[j],dp[j-a[i].first]+a[i].second);}}cout<<dp[m]<<'\n';}
}

完全背包

介绍:

不同于01背包的区别是每一个数可以无限次选取

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){int m,n;cin>>m>>n;vector<pair<int,int>>a(n+1);for(int i=1;i<=n;i++)cin>>a[i].second>>a[i].first;vector dp(n+1,vector<int>(m+1));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(j>=a[i].first)dp[i][j]=max(dp[i-1][j],dp[i][j-a[i].first]+a[i].second);else dp[i][j]=dp[i-1][j];}}cout<<dp[n][m]<<'\n';
}

空间优化

滚动数组优化:

和上述一样,只不过状态转移不一样
请添加图片描述

代码:
#include<bits/stdc++.h>
using namespace std;
int main(){int m,n;cin>>m>>n;vector<pair<int,int>>a(n+1);for(int i=1;i<=n;i++)cin>>a[i].second>>a[i].first;vector dp(2,vector<int>(m+1));for(int i=1;i<=n;i++){int y=i&1;for(int j=1;j<=m;j++){if(j>=a[i].first)dp[y][j]=max(dp[y^1][j],dp[y][j-a[i].first]+a[i].second);else dp[y][j]=dp[y^1][j];}}cout<<dp[n&1][m]<<'\n';
}

优化为一维

和上述的情况唯一的区别就是可以选择无数次,也就是可以从之前的状态转移过来
请添加图片描述

代码:
#include<bits/stdc++.h>
using namespace std;
int main(){int m,n;cin>>m>>n;vector<pair<int,int>>a(n+1);for(int i=1;i<=n;i++)cin>>a[i].second>>a[i].first;vector<int>dp(m+1);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(j>=a[i].first)dp[j]=max(dp[j],dp[j-a[i].first]+a[i].second);else dp[j]=dp[j];}}cout<<dp[m]<<'\n';
}

多重背包

介绍:

现在给定n种物品,每种物品有s个,求解容量为m的包中可以取到的最大价值

代码:

//将n件物品拆开即可
#include<bits/stdc++.h>
using namespace std;
int main(){int m,n;cin>>m>>n;vector<pair<int,int>>a;a.push_back({0,0});for(int i=1;i<=n;i++){int s,w,v;cin>>s>>w>>v;while(s--){a.push_back({v,w});}}int k=a.size()-1;vector<int>dp(m+1);for(int i=1;i<=k;i++){for(int j=m;j>=a[i].first;j--){dp[j]=max(dp[j],dp[j-a[i].first]+a[i].second);}}cout<<dp[m]<<'\n';
}

二进制优化多重背包

代码:

//可以发现,二进制数可以表示出每一个数,所有可以将多重背包存储为分别有多少个二进制数来表示当前的数
#include<bits/stdc++.h>
using namespace std;
struct node{int v,w,cnt;
};
int main(){int m,n;cin>>m>>n;vector<node>a;a.push_back({0,0});for(int i=1;i<=n;i++){int s,w,v;cin>>s>>w>>v;int k=1;while(s>=k){s-=k;a.push_back({v,w,k});k*=2;}if(s){a.push_back({v,w,s});}}vector<int>dp(m+1);int k=a.size()-1;for(int i=1;i<=k;i++){for(int j=m;j>=a[i].cnt*a[i].v;j--){dp[j]=max(dp[j],dp[j-a[i].cnt*a[i].v]+a[i].w*a[i].cnt);}}cout<<dp[m]<<'\n';
}
http://www.dtcms.com/a/560911.html

相关文章:

  • Docker 拉取镜像:SSL 拦截与国内镜像源失效问题解决
  • full join优化改写经验
  • 软件测试:黑盒测试用例篇
  • 【Linux】Linux第一个小程序 - 进度条
  • ubuntu新增用户
  • 青州市网站建设长沙招聘网58同城招聘发布
  • 江苏中南建设集团网站是多少长沙互联网网站建设
  • 从零开始的云原生之旅(十一):压测实战:验证弹性伸缩效果
  • 民宿网站的建设wordpress gallery
  • 【开题答辩全过程】以 广州网红点打卡介绍网站为例,包含答辩的问题和答案
  • Taro 源码浅析
  • Chart.js 混合图:深度解析与应用技巧
  • redis 大key、热key优化技巧|空间存储优化|调优技巧(一)
  • 监视你的脚本:自动 Linux 活动审计
  • 15.1.2.linux常见操作用例
  • 【Java Web学习 | 第五篇】CSS(4) -盒子模型
  • ubuntu samba 快速安装启用
  • 【数据结构】用顺序表实现通讯录
  • cpp / c++零基础就业学习一站式学习平台
  • FreeRTOS(二)
  • 开源AI智能名片链动2+1模式S2B2C商城小程序商业化路径优化研究
  • 中国优秀的企业网站做搜狐网站页面
  • 【效率工具】EXCEL批注提取工具
  • Python openpyxl 设置Excel单元格公式和工作簿合并
  • 作文生成器网站北京seo招聘信息
  • 常州网站设计制作贵美商城网站的首页怎么做代码
  • 新媒体矩阵系统全景解析:赋能企业数字化营销的智能引擎
  • 多目标优化问题在适应度计算中的支配矩阵
  • 从零开始的云原生之旅(九):云原生的核心优势:自动弹性伸缩实战
  • 【Swift】LeetCode 240.搜索二维矩阵 II