01背包问题:递归、动态规划求解

本文详细介绍了如何使用递归和动态规划解决01背包问题,探讨了这两种方法的思路和实现步骤,旨在帮助读者深入理解算法的应用。
摘要由CSDN通过智能技术生成

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]<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值