问题描述:给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包容量是c,问应如何选择装入背包中的中的物品,使得装入物品的总价值最大?
问题分析:我们用m[i][j]表示i~n的物品放入容量为j的背包里可以取得的最大价值,cw表示当前背包容量。在判断一个物品是否可以被放入时,若cw比wi小,说明wi放不下了,此时m[i][j] = m[i+1][j],若cw比wi大,那么有可放可不放两种情况:(1):放入背包后能够达到最大价值,此时m[i][j] = m[i+1][j];(2):不是最佳选择,后面还有更好的选择,此时需要做一次对比,对比的两项分别是:m[i+1][j](不放这个物品能够达到的最大价值)和m[i+1][j-wi]+ vi(放这个物品能够达到的最大价值),两者取最大值就好了。经过以上分析我们可以得到一个函数表达式 :
m[n-1][j] = {
m[n][j] j < w[n-1]
max( m[n][j], m[n][j-w[n-1]]+v[n-1] ) j >= w[n-1]
}
得到这个以后,如果我们知道m[n][j](j:0~n)我们就可以不断地向后推导得到m[1][c]的值,经过分析其实我们发现m[n][j]的之其实很好算,如果wn大于j就为0,小于就为vn,那么可以得到以下表达式:
m[n][j] = {
vn j >= wn
0 j < wn
}
根据函数式就可以写代码了: