题解 | #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);
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务