01背包问题:递归、动态规划求解
//使用记忆化搜索:(存在重叠子问题:对于index,c这一数据对可能求解多次)
int[][] memo;
/**
* 用[0...index]的物品,填充容积为c的背包的最大价值
* @param w:物体的重量
* @param v:物体的价值
* @param index:当前考虑的物体的index序列号
* @param c:当前所剩容量
* @return
*/
private int bestValue(int[] w,int[] v,int index, int c){
//递归的终止条件:没有物体可以放,或者当前剩下的容量为0
if(index <0 || c<=0){
return 0;
}
// 判断memo[index][c]中是否有值,有值的话不用继续多余重复的计算了,直接返回
if(memo[index][c] != -1){
return memo[index][c];
}
//尝试向背包中放入新的物品
//第一种情况:当前的物品不放入背包中,从[0...index-1]的来填充
int res = bestValue(w,v,index-1,c);
//第二种情况:当前的物品放入背包中
if(c >= w[index]){
//当前物品的重量可以放进去
//与第一种情况去最大值
res = Math.max(res,v[index]+ bestValue(w,v,index-1,c-w[index]));
}
memo[index][c] = res;
return res;
}
/**
* 01背包问题:递归算法(自顶向下)
* @param w
* @param v
* @param C
* @return
*/
public int package01(int[] w,int[] v,int C){
int n = w.length;
//n个物品,背包的容量为0-C,为C+1
memo = new int[n][C+1]<