欢迎光临散文网 会员登陆 & 注册

动态规划——背包问题

2023-09-05 14:34 作者:与时代脱轨的级数  | 我要投稿

背包问题的本质:

如果每件物品都要考虑是否放入背包所需的深度为n,最坏就需要O(2%5En)的时间

而在考虑每件物品的过程中,中间有很多分支的计算是重复的,或者说可以基于之前的运算得到的子问题答案简化本次的运算量

因此空间换时间,开一个数组记录中间的运算过程,得到答案。

先展示一下原始时间复杂度比较差的思路:

不管如何,用测试数据也能返回正确结果。

接下来使用动态规划,不过第一次写的时候,代码规划的稀烂:

不过总归把表完整打出来了,而且和手算的结果一样,说明思路是没问题的,重点还是一个算新的数据要根据已经算出的数据,就会简化一部分运算。

不过实际应用可能更需要的是展示具体的选择和最终的结果,而且上面的写法也太丑陋了,因此优化一下:

其中找出所选的物品是根据结果和表格来逆向推导的,这次的代码已经简洁了不少。

不过,如果只是需要一个结果的话,观察到表格中的下面一行都是根据上面一行得到的,开一个大二维数组似乎有点奢侈,所以用滚动数组优化一下:

当然,也可以考虑在原始递归的思路上改进,这样的做优点是看起来比较简单,也很好写:

最后提醒一下数组记得初始化。

动态规划——背包问题的评论 (共 条)

分享到微博请遵守国家法律