递归4

131 阅读1分钟

给定两个长度都为N的数组weights和values,

weights[i]和values[i]分别代表i号物品的重量和价值。

给定一个正数bag,表示一个载重bag的袋子,

你装的物品不能超过这个重量。

返回你能装下最多的价值是多少?

分析:这是一道典型的从左往右模型

对于第i个物品有两种情况
要了第i个物品,到第i+1个物品做决定
没要第i个物品,到第i+1个物品做决定
取两种情况的价值大的返回

代码:

public class Class1 {
    public static void main(String[] args) {
        int[] weights = {10,20,30,40,50,20,30,30,40};
        int[] values = {200,120,300,20,400,400,500,800,900};
        int i = process1(weights, values, 0, 0, 0, 160);
        int process1 = process(weights, values, 0, 0, 160);

        System.out.println(i == process1);
        System.out.println("process1 = " + process1);
        System.out.println("i = " + i);
    }




    /**
     * 背包问题
     * @param weights 物体重量数组
     * @param values 物体价值数组
     * @param position 第i个位置
     * @param value 总价值
     * @param totalWeight 总重量
     * @param bag 背包重量
     * @return
     */
    private static int process1(int[] weights,int[] values,int position,int value,int totalWeight,int bag){

        if(position == weights.length){
            return value;
        }
       int value1 = process1(weights, values, position + 1, value, totalWeight, bag);
       int tempValue = value + values[position];
       int tempWeight = totalWeight + weights[position];
       int value2 = 0;
       if(tempWeight<=bag) {//如果要了第i个物体重量超了直接没机会
           value2 = process1(weights, values, position + 1, tempValue, tempWeight, bag);
       }
       return value1 > value2 ? value1 : value2;
    }

    private static int process(int[] w,int[] v,int index,int alreadyW,int bag){
        if(alreadyW > bag){
            return -1;
        }
        if(index == w.length){
            return 0;
        }

        int p1 = process(w,v,index+1,alreadyW,bag);
        int p2next = process(w,v,index+1,alreadyW+w[index],bag);

        int p2 = -1;
        if(p2next != -1){
            p2 = v[index] + p2next;
        }
        return Math.max(p1,p2);
    }

}