从左往右的尝试模型题2

public class Test48 {
    //给定两个长度都为N的数组weights和values
    //weights[i]和values[i]分别表示i号物品的重量和价值
    //给定一个正数bag表示一个载重bag的袋子
    //装的物品不能超过这个重量
    //返回最多装的价值

    //法一
    public static int getMaxValue(int[] w , int[] v ,int bag) {
        return process1(w , v , 0 , 0, bag);
    }

    //所有重量在w[],所有价值在v[]
    //alreadyW为0……index-1上选择的总重量
    //bag为总载重
    //返回index往后的货的价值
    public static int process1(int[] w , int[] v , int index , int alreadyW , int bag) {
        if (alreadyW > bag) {
            return -1;
        }

        if (index == w.length) {
            return 0;
        }
        //第一种可能性:index的货不加,看后续最大价值
        int p1 = process1(w , v ,index + 1 , alreadyW , bag);

        //第二种可能性:加上index的货,看后续最大价值
        int p2next = process1(w , v , index + 1 , alreadyW + w[index] , bag);

        int p2 = -1;
        if (p2next != -1) {//如果第二种可能性存在,那么计算其后续的价值
            p2 = v[index] + p2next;
        }
        return Math.max(p1 , p2);
    }

    //法二
    public static int maxValue(int[] w , int[] v ,int bag) {
        return process2(w , v ,0 , bag);
    }

    //只剩下rest空间
    //index及其后面的货自动选择,但剩余空间不小于0
    //返回index及其后面货物的最大价值
    public static int process2(int[] w , int[] v ,int index , int rest) {
        if (rest < 0) {
            return -1;
        }

        if (index == w.length) {
            return 0;
        }

        //第一种可能性:不要当前的货,看后续价值
        int p1 = process2(w , v , index + 1 , rest);
        //第二种可能性:要当前的货,看后续价值
        int p2 = -1;

        int p2next = process2(w , v , index + 1 , rest - w[index]);
        if (p2next != -1) {//如果p2可能性存在,计算后续价值
            p2 = v[index] + p2next;
        }
        return Math.max(p1 , p2);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值