算法学习笔记(8.4)-完全背包问题
目录
Question:
图例:
动态规划思路
2 代码实现:
3 空间优化:
代码实现:
下面是0-1背包和完全背包具体的例题:
代码实现:
图例:
空间优化代码示例
Question:
给定n个物品,第i个物品的重量为wgt[i-1],价值为val[i-1],和一个容量为cap的背包。每个物品可以重复选取,问在限定背包容量的情况下能放入物品的最大价值。
图例:

-
动态规划思路
完全背包问题和0-1背包问题非常相似,区别仅在于不限制物品的选择次数。
- 在0-1背包问题中,每种物品只有一个,因此将物品i放入到被曝后,只能从前i-1个物品选择。
- 在完全背包问题中,每种物品的数量都是无限的,因此将物品i放入到背包后,仍可以从前i个物品中选择。
在完全背包问题的规定下,状态[i,c]的变化分为以下两种情况。
- 不放入物品i:与0-1背包问题相同转移至[i-1,c]。
- 放入物品i:与0-1背包问题不同,转移至[i,c-wgt[i-1]]。
从而转移状态方程为:
dp[i,c] = max(dp[i-1,c],dp[i,c-wgt[i-1]]+val[i-1])
2 代码实现:
# python 代码示例
def unbound_knap_sack_dp(wgt, val, cap) :n = len(wgt)dp = [ [0] * (cap + 1) for _ in range(n + 1)]for i in range(1, n + 1) :for j in range(1, cap + 1) :if wgt[i - 1] > c :dp[i][c] = dp[i - 1][c]else :dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])return dp[n][cap]
// c++ 代码示例int unboundKnapSackDP(vector<int> &wgt, vector<int> &val, int cap)
{int n = wgt.size() ;vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0)) ;for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= cap ; j++){if (wgt[i - 1] > c){dp[i][c] = dp[i - 1][c] ;}else{dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1) ;}}}return dp[n][cap] ;
}
3 空间优化:
由于当前状态是从左边和上边的状态转移而来,因此空间优化后应该对dp表中的每一行进行正序遍历。
图例所示:

代码实现:
# python 代码示例def unbound_knap_sack_dp_comp(wgt, val, cap) :n = len(wgt)dp = [0] * (cap + 1)for i in range(1, n + 1) :for j in range(1, cap + 1) :if wgt[i - 1] > c :dp[c] = dp[c]else :dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]) return dp[cap] ;
// c++ 代码示例int unboundKnapSackDPComp(vector<int> &wgt, vector<int> &val, int cap)
{int n = wgt.size() ;vector<int> dp(cap + 1, 0) ;for (int i = 1 ; i <= n ; i ++){for (int j = 1 ; j <= cap ; j++){if (wgt[i - 1] > c){dp[c] = dp[c] ;}else{dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]) ;}}}return dp[c] ;
}
下面是0-1背包和完全背包具体的例题:
零钱兑换问题:给定n中硬币,第i种硬币的面值为coins[i-1],目标金额为amt,每种硬币可以重复选取,问能够凑出目标金额的最少硬币数。如果无法凑出目标金额,则返回-1。
图例:

动态规划的思路:
零钱兑换可以看作是完全背包的一种特殊情况,两者具有以下联系和不同点。
- 两道题目可以相互转化,“物品“对应”硬币“、”物品重量“对应”硬币面值“、”背包容量“对应”目标金额“。
- 优化目标相反,完全背包问题是要最大化物品价值,零钱兑换问题是要最小化硬币数量。
- 完全背包问题是求“不超过“背包容量下的解,零钱兑换是求”恰好“凑到目标金额的解。
第一步:思考每轮的决策,定义状态,从而得到dp表
状态[i,a]对应的子问题为:前i种硬币能够凑出金额a的最少硬币数量,记作dp[i,a]。
二维dp表的尺寸为(n+1)*(amt+1).
第二步:找出最优子结构,进而推导出状态转移方程
本题与完全背包问题的转移状态方程存在以下两点差异。
- 本题要求最小值,因此需将运算符max()更改为min()。
- 优化主体是硬币数量而非商品的价值,因此在选中硬币时需执行+1即可。
dp[i,a] = min(dp[i-1,a],dp[i,a-coins[i-1]]+1)
第三步:确定边界和状态转移顺序
当目标金额为0时,凑出它的最小硬币数量为0,即首列所有dp[i,0]都等于0。
当无硬币时,无法凑出任意>0的目标金额,即使无效解。为使状态转移方程中的min()函数能够识别并过滤无效解,我们使用+∞来表示他们,即令首行所有dp[0,a]都等于+∞。
代码实现:
def coin_change_dp(coins, amt) :n = len(coins)dp = [ [0] * (amt + 1) for _ in range(n + 1)]for j in range(1, amt + 1) :dp[0][j] = inffor i in range(1, n + 1) :dp[i][0] = 0for i in range(1, n + 1) :for j in range(1, cap + 1) :if coins[i - 1] > j :dp[i][j] = dp[i - 1][j]else :dp[i][j] = max(dp[i - 1][j], dp[i][j - coins[i - 1]] + 1)return dp[n][amt] if dp[n][amt] != inf else -1
int coinsChangeDP(vector<int> &coins, int amt)
{int n = coins.size() ;vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0)) ;for (int j = 1 ; j <= amt ; j++) {dp[0][j] = INT_MAX ;}for (int i = 1 ; i <= n ; i++){dp[i][0] = 0 ;}for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= amt ; j++){if (coins[i - 1] > j){dp[i][j] = dp[i - 1][j] ;}else{dp[i][j] = min(dp[i - 1][j], dp[i][j - coins[i - 1]] + 1) ;}}}return dp[n][amt] != INT_MAX ? dp[n][amt] : -1 ;}
图例:

空间优化代码示例:
# python 代码示例def coins_change_dp_comp(coins, amt) :n = len(coins)dp = [inf] * (amt + 1)for i in range(1, n + 1) :for j in range(1, cap + 1) :if (coins[i - 1] > j) :dp[j] = dp[j]else :dp[j] = min(dp[j], dp[j - coins[i - 1]] + 1)return dp[amt] if dp[amt] != inf else -1
// c++ 代码示例
int coinsChangeDPComp(vector<int> &coins, int amt)
{int n = coins.size() ;vector<int> dp(cap + 1, INT_MAX) ;for (int i = 1 ; i <= n ; i++){for (int j = 1 ; j <= amt ; j++){if (coins[i - 1] > j){dp[j] = dp[j] ;}else{dp[j] = min([j], [j - coins[i - 1]] + 1) ;}}}return dp[amt] != INT_MAX ? dp[amt] : -1 ;}相关文章:
算法学习笔记(8.4)-完全背包问题
目录 Question: 图例: 动态规划思路 2 代码实现: 3 空间优化: 代码实现: 下面是0-1背包和完全背包具体的例题: 代码实现: 图例: 空间优化代码示例 Question: 给定n个物品…...
C++catch (...)陈述
catch (...)陈述 例外处理可以有多个catch,如果catch后的小括弧里面放...,就表示不限型态种类的任何例外。 举例如下 #include <iostream>int main() {int i -1;try {if (i > 0) {throw 0;}throw 2.0;}catch (const int e) {std::cout <…...
Redis实践
Redis实践 使用复杂度高的命令 如果在使用Redis时,发现访问延迟突然增大,如何进行排查? 首先,第一步,建议你去查看一下Redis的慢日志。Redis提供了慢日志命令的统计功能,我们通过以下设置,就…...
【Lora模型推荐】Stable Diffusion创作具有玉石翡翠质感的图标设计
站长素材AI教程是站长之家旗下AI绘图教程平台 海量AI免费教程,每日更新干货内容 想要深入学习更多AI绘图教程,请访问站长素材AI教程网: AI教程_深度学习入门指南 - 站长素材 (chinaz.com) logo版权归各公司所有!本笔记仅供AIGC…...
vscode 远程开发
目录 vscode 远程连接 选择 Python 环境 vscode 远程连接 按 CtrlShiftP 打开命令面板。输入并选择 Remote-SSH: Open SSH Configuration File...。选择 ~/.ssh/config 文件(如果有多个选项)。在打开的文件中添加或修改你的 SSH 配置。 这个可以右键…...
前端Vue组件化实践:打造灵活可维护的地址管理组件
随着前端技术的不断演进,复杂度和开发难度也随之上升。传统的一体化开发模式使得每次小小的修改或功能增加都可能牵一发而动全身,严重影响了开发效率和维护成本。组件化开发作为一种解决方案,通过模块化、独立化的开发方式,实现了…...
虚幻引擎ue5游戏运行界面白茫茫一片,怎么处理
根剧下图顺序即可调节游戏运行界面光照问题: 在大纲里找到post,然后选中它,找到Exposure 把最低亮度和最高亮度的0改为1即可...
《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》
代理IP如何选以及常见反爬策略 为什么需要代理? 因为有的网站会封IP,用户如果没有登录,那IP就是身份标识,如果网站发现用户行为异常就非常可能封IP 什么是代理IP 就是让一个人帮你转交请求,帮你转交的人对面不熟&a…...
Kotlin Flow 防抖 节流
防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案。 一:防抖(debounce)的概念: 防抖是指当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次, 如果设定时间到来之前&#x…...
Android Studio下载与安装
Android Studio下载与安装_android studio下载安装-CSDN博客...
【LC刷题】DAY24:122 55 45 1005
122. 买卖股票的最佳时机 II class Solution { public:int maxProfit(vector<int>& prices) {int result 0;for(int i 1; i < prices.size(); i ){result max(prices[i] - prices[ i - 1], 0);}return result;} };55. 跳跃游戏 link class Solution { public…...
从零开始的python学习生活2
接上封装 class Phone:__volt0.5def __keepsinglecore(self):print("让cpu以单核运行")def if5G(self):if self.__volt>1:print("5G通话已开启")else:self.__keepsinglecore()print("电量不足,无法使用5G通话,已经设置为单…...
【并发编程】进程 线程 协程
进程(Process)、线程(Thread)和协程(Coroutine)构成了计算机科学中实现任务并发执行的三种核心抽象机制。通常,为了提高程序的执行效率,开发者会根据应用场景和性能需求,…...
Vue的生命周期函数有哪些?详细说明
Vue.js 的生命周期函数包括以下几个阶段,每个阶段都有相应的钩子函数可以用来在特定时机执行自定义的逻辑。这些生命周期钩子函数使得我们可以在组件的不同阶段进行操作,从而管理组件的状态和行为。 1. beforeCreate: - 描述:…...
大语言模型应用--AI工程化落地
文章目录 大语言模型概述什么是大语言模型什么是机器学习什么是深度学习 理解大语言模型历史沿革关键 AIGC系统AI工程化项目的落地落地的方法Prompt工程(第一阶段)RAG检索(第二阶段)训练特定功能模型(第三阶段…...
我会什么开发技能
java我会什么? 一、并发编程 1、并发编程:jdk中的courren包只能够类实现(seamplore,CountDownLaunch,Pharse,CycliBarrier,CompletableFuture),AQS的原理,线…...
Run LoongArch64 Alpine VM on x86_64
一、Build from source(build on x86_64) Obtain the latest libvirt, virt-manager, and qemu source code, compile and install them. 1.1 Build libvirt from source sudo apt-get update sudo apt-get install augeas-tools bash-completion debhelper-compat dh-apparm…...
4层负载均衡和7层负载均衡
四层负载均衡(Layer 4 Load Balancing)指的是在网络传输层(TCP/IP模型中的第四层)进行负载均衡的技术。四层负载均衡通常使用IP地址、端口号和协议等信息来将网络流量分配到多个服务器上。它主要关心网络层的信息,不涉…...
前端Vue组件化实践:打造仿京东天猫商品属性选择器组件
在前端开发领域,随着业务需求的日益复杂和技术的不断进步,传统的整体式应用开发模式已逐渐显得捉襟见肘。面对日益庞大的系统,每次微小的功能修改或增加都可能导致整个逻辑结构的重构,形成牵一发而动全身的困境。为了解决这一问题…...
智慧城市3d数据可视化系统提升信息汇报的时效和精准度
在信息大爆炸的时代,数据的力量无可估量。而如何将这些数据以直观、高效的方式呈现出来,成为了一个亟待解决的问题。为此,我们推出了全新的3D可视化数据大屏系统,让数据“跃然屏上”,助力您洞察先机,决胜千…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
