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

17.18.动态规划,背包问题

没加记事本的模板

加记事本的模板

198. 打家劫舍

思路

dfs(i) 从一共i家偷,最多可以偷多少
不偷第i家,dfs(i)=》dfs(i-1)
偷第i家,dfs(i)=》dfs(i-2)+nums[i]

只回溯,不剪枝

画图

494. 目标和

小技巧


等价

思路

有的数字前面要加 +(我们把它们叫做 正数军团P PP
有的要加 -(我们把它们叫做 负数军团N NN
P+N=sum
P-N=target
P+N-(P-N)=2N=sum-target;

所以这题我们可以简化成从nums中挑和为N的组合

这样我们可以用组合型回溯或者0-1背包来解决

0-1背包

dfs(i,c)的含义有2层
微观的:现在就来折腾第i个
宏观的:用i个数,填满c的背包,有几种方法。(记住计算机是从0开始的)

选第i个,dfs(i,c)=>dfs(i-1,c-nums[i])
不选,dfs(i,c)=>dfs(i-1,c)
所以dfs(i,c)= dfs(i-1,c-1) + dfs(i-1,c)

代码

首先写一下0-1背包的代码(不包含剪枝)

classSolution{public:intfindTargetSumWays(vector<int>&nums,inttarget){intn=nums.size();intl=accumulate(nums.begin(),nums.end(),0)-target;if(l<0||l%2!=0){return0;}intm=l/2;autodfs=[&](thisauto&&dfs,inti,intc)->int{if(i<0){returnc==0;}returndfs(i-1,c)+dfs(i-1,c-nums[i]);};//从第0~第n-1个中,装满背包m,有几种方案。returndfs(n-1,m);}};

加上记事本,剪枝

classSolution{public:intfindTargetSumWays(vector<int>&nums,inttarget){intsum=accumulate(nums.begin(),nums.end(),0);intl=sum-target;intn=nums.size();if(l%2==1||l<0){return0;}//负数军团 在nums中,挑几个数的和为cintm=l/2;vector<vector<int>>memo(n,vector<int>(m+1,-1));autodfs=[&](thisauto&&dfs,inti,intc)->int{if(i<0){returnc==0?1:0;}// 之前计算过if(memo[i][c]!=-1){returnmemo[i][c];}// 只能不选if(c<nums[i]){returnmemo[i][c]=dfs(i-1,c);}// 不选 + 选returnmemo[i][c]=dfs(i-1,c)+dfs(i-1,c-nums[i]);};returndfs(n-1,m);}};

322. 零钱兑换

思路

dfs(i,c) 共i个数据,每个数据可以用无数处,返回填满背包最少需要多少数据

没剪枝

classSolution{public:intcoinChange(vector<int>&coins,intamount){intn=coins.size();autodfs=[&](thisauto&&dfs,inti,intc)->int{if(i<0){//如果 c == 0,说明钱刚好凑齐了!还需要 0 枚。returnc==0?0:INT_MAX/2;}//只能不选if(c<coins[i])returndfs(i-1,c);//不选和选returnmin(dfs(i-1,c),dfs(i,c-coins[i])+1);};intans=dfs(n-1,amount);returnans<INT_MAX/2?ans:-1;}};

剪枝

加了

if(memo[i][c]!=-1)returnmemo[i][c];
http://www.jsqmd.com/news/722985/

相关文章:

  • Dify - (一)、本地部署Dify+聊天助手/Agent
  • 解读C++11 原生字符串
  • 路由器1111111111
  • 2025_NIPS_Understanding the Expressive Power and Mechanisms of Transformer for Sequence Modeling
  • C 基础(16) - C 预处理和C库
  • 终极指南:如何用OnStep将普通望远镜升级为智能寻星系统
  • 手把手带你了解C++最小栈
  • 2026年3月靠谱的汽车增压器组件口碑推荐,欧曼增压器/船机增压器/7830增压器/工程机械增压器,汽车增压器供应商推荐 - 品牌推荐师
  • MIMO稀疏信道估计:MOMPnet算法与硬件损伤校准
  • 95%小白选手持喷码机的误区
  • 华硕笔记本性能调校终极指南:G-Helper完全替代Armoury Crate
  • 国网低压侧, 智能融合终端, 微应用基础库
  • 2025_NIPS_Table2LaTeX-RL: High-Fidelity LaTeX Code Generation from Table Images via Reinforced Mu...
  • 出轨小三就会净身出户?告诉你出轨离婚财产分割的5个真相
  • ARM架构异常处理与RAS特性深度解析
  • PHP开发的OA办公系统源码|集成CRM客户管理+ERP订单合同管理(PC端与移动端双平台)
  • 2026年惠州保安公司行业解析,惠州工厂保安公司服务优势与选择要点,帮你判断惠州哪家保安公司好 - 栗子测评
  • Proxmox VE (PVE):虚拟化神器,从0开始踩坑
  • 出海办公效率瓶颈凸显,跨应用AI办公助手如何打通跨境业务孤岛?
  • 如何快速实现老Mac升级:OpenCore Legacy Patcher终极指南
  • 抖音无水印视频下载终极指南:3分钟掌握免费高清资源获取秘籍
  • ARM虚拟化核心:HFGRTR_EL2寄存器详解与应用
  • 石墨烯地暖高频自动化设备哪家好?2026年石墨烯地暖高频自动化设备/医疗袋高频热合机厂家推荐权威盘点:华日金菱领衔 - 栗子测评
  • 2026年怎么挑商用和面机厂家?核心技术看这几点 - 优质品牌商家
  • ARM SPE性能分析:PMSIDR_EL1寄存器详解与实践
  • Coordinate IM 系统 - 企业即时通讯解决方案
  • 【教学类-160-14】20260425 AI视频培训-练习014“豆包AI视频《月下枯蔷(哥特风)》+豆包图片风格:油画”
  • ARMv8/v9异常处理与ESR_EL2寄存器深度解析
  • ContextFlow视频对象编辑技术解析与应用实践
  • Increasing Triplet Subsequence贪心解法分析