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]);
最后计算出结果后,还要把哪些东西放入背包可以打印出来,这个利用倒循化进行遍历,如果后一个物品放