背包问题
问题介绍
假定需要将Goods={g1,g1,…gn}放入容量为ALL的背包内,volumej代表第i个物品的体积,valuej代表第j个物品的价值。我们要把这些物品装进背包,这些物品的体积不超过ALL,而且要使它们的总价值达到最大。因为背包不可包含一个以上的同类物品,所以一般称这样的背包问题为0/1背包问题,完全背包问题类似于兑换零钱问题。
解决思路
设C[i,j]表示从前i项{g1,g1,…gn}取出来装入体积为j的背包的物品的最大价值,其中i∈[0,n],j∈[0,ALL],最终chart[n,ALL]是我们最终想要得到的结果。可以通过观察得到以下结论:
C[i,j]为下面两个量的最大值。
①V[i-1,j]:使用最优的方法将{g1,g1,…gi-1}放入容量为j的背包所得的最大价值。
②V[i-1,j-volumei]+value[i]:使用最优的方法将{g1,g1,…gi-1}放入容量为j-volumei的背包所得的最大价值再加上物品gi的价值。递推式
C(i,j)=⎧⎩⎨0,C[i−1,j],max(C[i−1,j],C[i−1,j−volumei]+val