完全背包问题是,有N种物品,体积为w,价值为v ,且每种物品都有无限件,那么,现在有体积为capacity的背包,怎么放物品每种物品放几件能使背包的价值Val最大。
动态规划的重点是找到递推关系式,完全背包的递推关系式为:Val[i][j] = max{Val[i-1][j-k*w[i]]+k*v[i]} 0<=k*w[i]<=j , 即,当背包的剩余容量为 j 时,放入k件物品 i 的价值Val[i][j]。
上图为所选物品的体积和价值,背包剩余容量 j 和 背包价值Val存在这几种关系:一,当 j < k*w[i] (k=1)时 , 判断Val[i-1][j]和Val[i][j-1]的大小,Val[i][j]取大值 ; 二、当 j >= k*w[i]时,Val[i][j] = max{Val[i-1][j-k*w[i]]+k*v[i]} 0<=k*w[i]<=j;三、这里加一个优化点,当v[i]<v[i-1],w[i]>w[i-1]时,Val[i][j] = Val[i-1][j]。
递推开始: