问题:
一个背包,承重为C。n个物品,每个物品有各自的重量和价值。如何选择将哪些物体放入背包中,使得物品总重量不超过背包承重且物品总价值最大?
问题抽象:
已知:
背包的maxWeight = C, 这里C=10
物品的数量items = N, 这里N= 4
物品的重量Values of items为 V[], 这里 V[]= {10, 40, 30, 50}
物品的价值Weight of items 为 W[], 这里 = W[] = {5, 4, 6, 3}
求解:
满足条件的物品组合有很多,其中一些的总价值最大,即所求的结果maxValue,这里maxValue = k(N, C)
maxValue所对应的组合 ,例如: 1,2,3 或 2,4,5,即表示将物品1,2,3或者2,4,5放入背包,总价值最大
思路分析:
这是求解一定约束条件下(背包承重),多种组合里最优组合。可以采用动态规划的方法。
动态规划的核心思想为:全局最优解中包含局部最优解。
这里问题的规模应该为待放入背包中的物品的数量。
动态规划的关键是:什么是问题的规模?已知较小规模问题的最优解,如何得到较大规模问题的最优解。
如果我们已知了较小规模问题的最优解,如知道了物品数量为3时的最优解,k(3,j),和所有的K(3,1) K(3,2) K(3,3) 。。。K(3,j)
那么 k(4,j) = max{ k(3,j), k(3,j-w[4])+ v[4] }
如何理解上面的关系式呢?
关键是看第4个物品可不可放入包中,如果不放入包中最优解就还是k(3,j),
如果放入包中,则原来的包中的重量必要存在多余w[4]重量的空间
动态规划的状态,和状态转换方程
k(i,j) = max{ k(i-1,j), k(i-1,j-w[i])+ v[i] } ( j >= v[i]))
k(i,j) = k(i-1, j) ( j < v[i]))
算法过程示意:
如何得到最优的物品排列组合:
定义一个s[N], 其中s[i]等于0或者1,,s[i]=0表示第i个物品不在排列中,反之在。