算法学习笔记(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可视化数据大屏系统,让数据“跃然屏上”,助力您洞察先机,决胜千…...
开源音频工作站Audacity:专业级音频处理的自由解决方案
开源音频工作站Audacity:专业级音频处理的自由解决方案 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 在数字音频创作领域,专业软件往往意味着高昂的许可费用和陡峭的学习曲线。Audacity作…...
FLUX.1-dev像素艺术模型效果对比:原生FLUX.1-dev vs Pixel Dream微调版差异
FLUX.1-dev像素艺术模型效果对比:原生FLUX.1-dev vs Pixel Dream微调版差异 1. 像素艺术生成技术概览 像素艺术作为一种独特的数字艺术形式,近年来在游戏开发、NFT创作和数字设计领域重新焕发活力。传统像素艺术创作需要艺术家手动绘制每个像素点&…...
把股票数据能力接进 AI:stock-sdk-mcp 的实践整理
起因 如果你经常用 Cursor、Claude 这类 AI 工具,应该已经能明显感觉到它们在通用问答和代码任务上越来越强了。但一旦问题变成金融数据查询,比如“看看贵州茅台今天的行情”“把最近 60 个交易日的日 K 线拉出来,再判断一下 MACD 和 RSI”&…...
QT实战:用QScrollArea+QListWidget复刻迅雷设置界面(附完整源码)
QT实战:用QScrollAreaQListWidget复刻迅雷设置界面(附完整源码) 在桌面应用开发中,设置界面的设计往往考验着开发者对布局和交互逻辑的掌控能力。迅雷作为一款经典的下载工具,其设置界面以清晰的导航结构和流畅的滚动体…...
Claude Code + DeepSeek:用自然语言从PRD到上线的打地鼠游戏全流程实录
Claude Code DeepSeek:用自然语言从PRD到上线的打地鼠游戏全流程实录 最近在技术社区里,一个有趣的趋势正在兴起——开发者们开始尝试用自然语言描述需求,然后让AI编程助手自动完成从文档编写到代码生成的全流程。这听起来像科幻小说里的场景…...
OpenClaw安全防护全攻略:Qwen3-32B-Chat操作权限精细控制
OpenClaw安全防护全攻略:Qwen3-32B-Chat操作权限精细控制 1. 为什么需要安全防护? 当我第一次把OpenClaw接入本地部署的Qwen3-32B-Chat模型时,那种兴奋感至今记忆犹新——我的电脑突然有了一个24小时待命的AI助手。但很快,一个细…...
告别第三方工具:用Cloudflare官方测速文件快速检测你的网络性能
告别第三方工具:用Cloudflare官方测速文件快速检测你的网络性能 你是否遇到过这样的场景:视频缓冲转圈、文件下载龟速、在线会议卡顿,却不知道是网络问题还是服务商的问题?传统的测速工具要么需要安装软件,要么广告满天…...
深度学习模型的绿色优化:Torch-Pruning减少能源消耗的终极指南
深度学习模型的绿色优化:Torch-Pruning减少能源消耗的终极指南 【免费下载链接】Torch-Pruning [CVPR 2023] Towards Any Structural Pruning; LLMs / Diffusion / Transformers / YOLOv8 / CNNs 项目地址: https://gitcode.com/gh_mirrors/to/Torch-Pruning …...
TrafficMonitor插件完全指南:打造终极个性化Windows监控中心
TrafficMonitor插件完全指南:打造终极个性化Windows监控中心 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins TrafficMonitor作为Windows系统监控工具,通过…...
EspSoftwareSerial:ESP系列高性能软件串口实现
1. 项目概述EspSoftwareSerial是专为 ESP 系列微控制器(ESP8266、ESP32、ESP32-S2、ESP32-S3、ESP32-C3)设计的软件串口实现库,其核心目标是提供与 Arduino AVR 平台SoftwareSerial库高度兼容的 API 接口,同时充分利用 ESP 架构特…...
