0-1背包问题总述
0-1背包问题是最简单的问题,此外还要完全背包问题、多重背包问题、混合背包问题、二维费用背包问题、分组背包问题等等。好的参考资料可以见《背包问题九讲》:https://www.kancloud.cn/kancloud/pack/70124
其中0-1背包问题是最基本的问题,其问题描述如下:
给出n个珍珠的体积v[i]和其价值price[i],将他们装入一个大小为C的背包,最多能装入的总价值有多大?
之所以叫0-1背包,就是因为n个物品,每个只有一件,只有装包/不装包两种状态,即0-1问题。
解决该问题的方法为动态规划(Dynamic Programming),动态规划单听这个词觉得很庞大,其实可以说是对递归的一种优化,递归是不管需不需要都进行重新计算,其计算复杂度极高,动态规划用数据来存储其之前的状态,当进行下一步计算的时候直接调用不需要重新计算。那么问题来了,动态规划需要确定两个点:状态、状态转移方式。这里可以参考很多资料,不再仔细叙述。
状态转移方式:dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]] +price[i]);

最后计算出结果后,还要把哪些东西放入背包可以打印出来,这个利用倒循化进行遍历,如果后一个物品放入后价值高,则确定是要放入的;然后更新当前的体积。
二维数据解决0-1背包问题
二维空间的python代码如下:
# 将珠宝装入背包,珠宝Jewelry有体积、价值(v,price)
# 背包总容量为C,问题:如何将最有价值的珠宝装进

本文介绍了0-1背包问题的基本概念,通过动态规划解决此类问题,并详细阐述了如何使用一维数据进行空间优化,降低算法的空间复杂度。提供了一维和二维空间解决方案的Python代码示例。
4954

被折叠的 条评论
为什么被折叠?



