01背包问题动态规划详解及C代码
动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。问题描述:给定N中物品和一个背包。物品i的重量是Wi其价值位Vi,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大??在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包。不能讲物品i装入多次,也不能只装入物品的一部分。因此,该问题被称为01背包问题。
问题分析:令Vij表示在前i1i
个物品中能够装入容量为就j1jC的背包中的物品的最大价值,则可以得到如下的动态规划函数12Vi0V0j0VijVi1jjwiVijmaxVi1jVi1jwivijwi1式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i1个物品得到的最大价是相同的,即物品i不能装入背包;第2个式子表明如果第i个物品的重量小于背包的容量,则会有一下两种情况:a如果把第i个物品装入背包,则背包物品的价值等于第i1个物品装入容量位jwi的背包中的价值加上第i个物品的价值vib如果第i个物品没有装入背包,则背包中物品价值就等于把前i1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。
比如01背包问题。因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放N1物品中的最大价值。怎么能保证总选择是最大价值呢?看下表。测试数据:103344556
fcij数组保存了123号物品依次选择后的最大价值这个最大价值是怎么得来的呢从背包容量为0开始1号物品先试012的容量都不能放所以置0背包容量为3则里面放4这样这一排背包容量为45610的时候,最佳方案都是放4假如1号物品放入背包则再看2号物品当背包容量为3的时候,最佳方案还是上一排的最价方案c为4而背包容量为5的时候,则最佳方案为自己的重量5背包容量为7的时候,很显然是5加上一个值了。加谁很显然是743的时候上一排c3的最佳方案是4所以。总的最佳方案是54为9这样一排一排推下去。最右下放的数据就是最大的价值了。注意第3排的背包容量为7的时候最佳方案不是本身的6而是上一排的9说明这时候3号物品没有被选选的r