题解 | #01背包#

01背包

https://www.nowcoder.com/practice/2820ea076d144b30806e72de5e5d4bbf

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算01背包问题的结果
     * @param V int整型 背包的体积
     * @param n int整型 物品的个数
     * @param vw int整型二维数组 第一维度为n,第二维度为2的二维数组,vw[i][0],vw[i][1]分别描述i+1个物品的vi,wi
     * @return int整型
     */
    public int knapsack (int V, int n, int[][] vw) {
        // write code here
        int[] weight=new int[n];
        int[] value=new int[n];

        for(int i=0;i<n;i++){
            weight[i]=vw[i][0];
            value[i]=vw[i][1];
        }

        return process(weight,value,n,V);
    }

    int[][] memo ;
    int[] weight;
    int[] value;
    int n;

    public int process(int[] weight, int[] value, int n, int bagWeight) {
        memo= new int[n][bagWeight + 1];
        for(int i=0;i<n;i++){
            Arrays.fill(memo[i],-1);
        }

        this.weight=weight;
        this.value=value;
        this.n=n;
        return process(0,bagWeight);
    }

// 来到物品index这里,装还是不装,bagAvl表示背包剩余体积,gv表示已经获取的价值
    public int process(int index,
                       int bagAvl) {
        if (bagAvl == 0 || index == n) {
            // 背包已经装满 或者 已经对所有物品都进行了选择
            return 0;
        }
        if (memo[index][bagAvl] != -1) {
            return memo[index][bagAvl];
        }

        // 不装
        int p1 = process(index + 1,bagAvl);
        // 装
        int p2 = 0;
        if (bagAvl >= weight[index]) {
            p2 = process(index + 1,bagAvl-weight[index])+value[index];
        }

        memo[index][bagAvl] = Math.max(p1, p2);
        return memo[index][bagAvl];
        // return  Math.max(p1, p2);
    }
}

全部评论

相关推荐

哈哈哈看得出来讨论很沸腾了,很高兴了属于是&nbsp;大家快说说截止目前还有哪家互联网大厂不是双休?(在说谁,在说谁)一起避坑!!
不正经草莓:听红薯来的同事讲,他们之前周六下午6点多就走了,一天也没啥事儿到手6k多工资,要我也加班查看图片
投递小红书等公司6个岗位 > 小红书取消大小周
点赞 评论 收藏
分享
purcoter:虚拟货币预测正确率百分之99,还要找工作干嘛,不早就财富自由了
点赞 评论 收藏
分享
03-27 17:33
门头沟学院 Java
代码飞升:同学院本,你要注意hr当天有没有回复过,早上投,还要打招呼要推销自己,不要一个劲投
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务