news 2026/4/30 4:08:09

17.18.动态规划,背包问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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];
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 4:03:49

项目中**LabVIEW 位操作逻辑**的完整、清晰解释,以及与 C# 实现的对应关系

以下是针对项目中LabVIEW 位操作逻辑的完整、清晰解释,以及与 C# 实现的对应关系。 LabVIEW 中关键位操作函数 你的描述(“数字转换成 bool 数组 → 反转一维数组 → 循环检查”)主要涉及以下两个核心 LabVIEW 函数: Number To Boolean Array(数值转布尔数组) 位置:Pr…

作者头像 李华
网站建设 2026/4/30 3:57:24

CaTok:1D因果图像标记化方法解析与应用

1. 项目概述CaTok是一种创新的1D因果图像标记化方法&#xff0c;它基于MeanFlow解码器架构&#xff0c;专门针对序列建模任务中的图像处理需求而设计。这个方法的核心思想是将二维图像数据转化为一维的因果标记序列&#xff0c;同时保持空间信息的完整性。我在计算机视觉和序列…

作者头像 李华
网站建设 2026/4/30 3:56:11

SSH隧道与Tailscale实现AI代理远程运行时本地化连接

1. 项目概述&#xff1a;当本地浏览器需要连接远程大脑时在AI智能体与自动化工具的开发实践中&#xff0c;我们常常会遇到一个经典的“身体与大脑”分离困境。一个强大的AI运行时&#xff08;大脑&#xff09;可能运行在拥有充足算力、稳定网络或特定依赖的远程服务器上&#x…

作者头像 李华
网站建设 2026/4/30 3:50:26

Go分布式爬虫框架clawjob:架构解析与生产部署指南

1. 项目概述与核心价值最近在折腾一些数据采集和自动化任务时&#xff0c;发现了一个挺有意思的项目&#xff0c;叫clawjob。乍一看这个名字&#xff0c;结合它的仓库地址jackychen129/clawjob&#xff0c;就能猜到这玩意儿跟“爬虫”和“任务”脱不了干系。没错&#xff0c;它…

作者头像 李华
网站建设 2026/4/30 3:46:24

企业级IaC规范实践:iac-spec-kit如何解决基础设施即代码落地难题

1. 项目概述&#xff1a;当企业级IaC遇上“开箱即用”如果你在运维或云原生领域摸爬滚打过几年&#xff0c;肯定对“基础设施即代码”不陌生。从早期的Terraform、Ansible&#xff0c;到后来的Pulumi、Crossplane&#xff0c;工具层出不穷&#xff0c;理念深入人心。但真正把Ia…

作者头像 李华