鼓捣好久 终于了然了一些
0-1背包问题描述
有一个窃贼在偷窃一家商店时发现有n件物品,第i件物品价值为vi元,重量为wi,假设vi和wi都为整数。他希望带走的东西越值钱越好,但他的背包中之多只能装下W磅的东西,W为一整数。他应该带走哪几样东西?
【注】0-1背包问题中:每件物品或被带走,或被留下,(需要做出0-1选择)。小偷不能只带走某个物品的一部分或带走两次以上同一个物品。
采用动态规划算法求解0-1背包问题,
用子问题定义状态:即f[i][ J]表示前i件物品放入一个容量为j的背包可以获得最大价值。则其核心状态转移方程是:
f[i][ j]=max{f[i-1][ j],f[i-1][ j-a[i]]+c[i]}
即,“将前i件物品放入容量为j的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为j的背包中”,价值为f[i-1][j];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为j-a[i]的背包中”,此时能获得的最大价值就是f[i-1][ j-a[i]]再加上通过放入第i件物品获得的价值c[i]
具体实现程序详见https://github.com/Wuyanan520/boruishangge/,源码为.ipython文件,为方便您审阅,转存了一份html文件。