背包问题学习
今天学习了下背包问题,也就是传说中的NP问题,屌屌的。我学习的是最简单的背包问题。
打个简单的比方,假设你找到一片宝藏,这时候你有一个背包,这个背包是有容量限制的,最多只能装10公斤的东西。
然后宝藏中有各种宝石,黄金,和价值连城的珍珠,可惜的是,每件宝物都有其对应的价值和重量,这个时候问题就来了,你怎么选择,能够使得你背包里面装的宝物价值最大化呢?
假设现在宝藏中只有一个宝石,其价值是5,重量是3,那么你的选择是将宝石装进背包,这个时候,背包所承载的物品的价值是5,背包剩余的重量还剩7.
那么再假设下,现在宝藏中有两块宝石,宝石A价值是5,重量是3,宝石B的价值是6,重量是6. 那么你的选择当然是宝石A和宝石B一起放进去。那么这个时候,包包所承载的宝石价值就是11,重量是9. 那么假设宝石B的价值是6,但重量是8,那么就不能把A和B都放在背包了,因为两者重量加起来超过了10.所以要求价值最大化,就只能放宝石B。
还可以依次往下看三块宝石,四块宝石,五块宝石。。。的选择情况。
其实我这里没有讲的特别学院派,讲状态和状态转移方程。但是我的理解就是这样的。于是我照着这个思路,以及网上的源码,边理解边写了一遍,然后又用go去实现了这个算法。
这个问题可以用DP来解,也可以用MIP来解。不过对于我来说,用DP来解就已经很受用了,MIP太高端,我也摸不太透。
下面就解释下我的代码。
|
|
理解了原理,然后我有用Go实现了一版:
|
|
感觉屌屌哒,背包问题至少我知道了个大概。