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

动态规划之完全背包

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。

完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。

二维数组

在 01背包理论基础(二维数组) (opens new window)中,背包先空留出物品1的容量,此时容量为1,只考虑放物品0的最大价值是 dp[0][1],因为01背包每个物品只有一个,既然空出物品1,那背包中也不会再有物品1!

而在完全背包中,物品是可以放无限个,所以 即使空出物品1空间重量,那背包中也可能还有物品1,所以此时我们依然考虑放 物品0 和 物品1 的最大价值即: dp[1][1], 而不是 dp[0][1]

#include <iostream>
#include <vector>
using namespace std;int main() {int n, bagWeight;int w, v;cin >> n >> bagWeight;vector<int> weight(n);vector<int> value(n);for (int i = 0; i < n; i++) {cin >> weight[i] >> value[i];}vector<vector<int>> dp(n, vector<int>(bagWeight + 1, 0));// 初始化for (int j = weight[0]; j <= bagWeight; j++)dp[0][j] = dp[0][j - weight[0]] + value[0];for (int i = 1; i < n; i++) { // 遍历物品for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量if (j < weight[i]) dp[i][j] = dp[i - 1][j];else dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]);}}cout << dp[n - 1][bagWeight] << endl;return 0;
}

 一维数组

当你理解了01背包一维数组的写法为什么要倒序之后那就很简单

正序不就是物品无限取了吗直接上代码

#include <iostream>
#include <vector>
using namespace std;int main() {int N, bagWeight;cin >> N >> bagWeight;vector<int> weight(N, 0);vector<int> value(N, 0);for (int i = 0; i < N; i++) {cin >> weight[i] >> value[i];}vector<int> dp(bagWeight + 1, 0);for (int i = 0; i < N; i++) { // 遍历物品for (int j = weight[i]; j <= bagWeight; j++) { // 遍历背包容量,从 weight[i] 开始dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}}cout << dp[bagWeight] << endl;return 0;
}

 有好几种写法,顺序可以调换条件也可以拿出来这里我就只写一种我觉得顺手的哈

http://www.xdnf.cn/news/4493.html

相关文章:

  • C++ -- 哈希扩展
  • 探索智能仓颉:Cangjie Magic开发体验
  • 电子电器架构 --- 网关释放buffer的必要性
  • 紫光展锐全新奇迹手游引擎,开启游戏“芯”时代
  • 安卓工程build.gradle中的Groovy的常见知识点
  • linux_进程地址空间(虚拟地址空间)
  • 【背包dp----01背包】例题三------(标准的01背包+变种01背包1【恰好装满背包体积 产生的 最大价值】)
  • MySQL基础关键_010_数据库设计三范式
  • OC语言学习——面向对象(下)
  • 在 R 语言中,data$Age 是一种常见的语法结构
  • taro的学习记录
  • Leetcode 刷题记录 09 —— 链表第三弹
  • 通义读光系列文字检测+识别模型端到端OCR应用
  • 无网络环境下配置并运行 word2vec复现.py
  • tmpfs和普通文件系统相比有哪些优缺点
  • CentOS 安装 Zellij 终端复用器教程
  • Android 移动应用开发:点击按钮打开电话拨号界面
  • Object.defineProperty()
  • LC滤波电路使用TSMI一体成型贴片电感的好处
  • Python初学者笔记第十一期 -- (字符串编程练习题)
  • k8s高可用集群,自动化更新证书脚本
  • 2025-05-07 Unity 网络基础8——UDP同步异步通信
  • 111、二叉树的最小深度
  • 信息革命对经济、货币体系及权力结构的颠覆性影响
  • 数据结构——排序(万字解说)初阶数据结构完
  • 【Python爬虫电商数据采集+数据分析】采集电商平台数据信息,并做可视化演示
  • 【C/C++】虚函数
  • 某大型交通规划设计院转型实践:数智化破局复杂工程项目管理,实现高效人力资源一体化管理
  • 华为设备链路聚合实验:网络工程实战指南
  • 【LeetCode】高频 SQL 50题 题解