动态规划算法

本文深入浅出地介绍了动态规划的基本概念和应用,通过一个具体的背包问题案例,详细展示了如何运用动态规划思想解决问题的过程。文章还提供了一个关于计算方法数量的算法实例,帮助读者更好地理解和掌握动态规划的核心思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念理解
动态规划是从小问题着手,逐步解决大问题,每次决策依赖于当前的状态 进而引起状态的转移,把一个问题拆分成子问题的一种思想,利用二维的思想在解决生活中的各种问题。
举个例子:假设你明天要去户外,你有一个背包,容量只有4千克。你可盗窃的东西有三件:
在这里插入图片描述
为了让你的背包装的东西价值最高,你会怎样选择:
最简单的算法是,尝试各种商品的组合,并找出价值最高的组合。
在这里插入图片描述
这样可行,但是非常慢,试想一下,3件商品需要计算8中不同的组合,如果4 件 那你需要2^4种组合,每增加一种商品 计算的范围将扩大一倍。时间复杂度O(n^2),慢如蜗牛。只要商品数量扩大到一定程度,这种该算法行不通。
当然,答案是使用动态规划,每个动态规划算法都是从一个网格开始,网格如下:
在这里插入图片描述
网格的各行为商品,你都需要,各列为不通容量(1~4)的背包,所有这些列你也都需要,因为将帮助你计算子背包的价值。
1.手机行
我们先一步一步做,首先看第一行,你将尝试将它装入背包,在每一个单元格,你都需要做一个简单的决定,装不装手机,别忘了,你要找出一个价值最高的商品组合.第一各单元格的背包容量为1kg,手机重量也是1kg,能装入背包,因此装入,价值为1500元因此填入:
在这里插入图片描述
再看下一个,背包容量为2kg,饼干为1kg 完全可以装得下,这行的其他单元格也一样,因为这一行只有饼干可供选择,假设其他商品还没有来得及装。因此 网格变为如下:
在这里插入图片描述
你的目的是让背包中商品价值最大化,这行表示当前最大值,当然,你知道这并不是最优解,随算法的往下执行,你将逐步计算并修改最大价值。我们再看
在这里插入图片描述
该不该装大桶水呢,背包容量为1kg,税太重了 装不下 看下一个 背包容量为2kg 同样装不下,容量为3kg 也装不下,容量为4kg 刚好能装下,而且价值最高,因此网格变为:
在这里插入图片描述
你更新了最大值,因此下面 你逐步更新最大值,用同样的方法来处理手机行,手机重3kg,没法装入,容量为1kg 2kg的背包,因此 前两个单元格的最大价值依然是1500元,
在这里插入图片描述
当背包容量为3kg时,原来的最大价值时1500元,但是现在你可以选择装入价值3000元的大包饼干,因此,更新最大价值为3000元,
在这里插入图片描述
对于容量为4kg的背包,情况有趣,也非常重要,当前的最大价值为4000元.你可以不装大桶水,只装饼干 价值只有3000元 4000 > 3000 价值没有原来高,但想一想,饼干重量只有3kg,还剩1kg容量没有使用! 在1kg容量中 可装入的最大价值是多少呢?根据之前计算的最大价值可知,1kg背包可装入的最大价值是手机 1500元,因此,你需要做如下比较:

4000 vs 3000+1500 ?
因此 网格的最终计算结果如下:
在这里插入图片描述
确定最终答案 装入手机和大包饼干 价值最大。
其实,在计算每一个单元格时 都使用了相同的公式:
在这里插入图片描述
同样,
有数组nums,nums中所有的值都为正数且不重复,每种面值的货币可以使用任意次,再给定一个整数capacity(小于等于1000)为和,能有多少种计算方法。
给定数组nums及它的大小(小于等于100),同时给定一个整数capacity,请返回有多少种方法相加等于capacity。
测试样例:
[1,3,5],3,8
返回:5

解析:设tmp[n][m]为使用前n中凑成的m的种数,那么就会有两种情况:
使用第n种:tmp[n-1][m]+tmp[n][m-nums[n]]
不用第n种:tmp[n-1][m],为什么不使用第n种呢,因为nums[n]>m。
这样就可以求出当m>=nums[n]时 tmp[n][m] = tmp[n-1][m]+tmp[n][m-nums[n]],否则,tmp[n][m] = tmp[n-1][m]
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值