题解 | #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
        return dp(vw, V);
    }

    public int dp(int [][] vw, int V) {
        if (V < 0 || vw.length <= 0) {
            return 0;
        }
        int [][] dp = new int[vw.length+1][V+1];
        for (int i = vw.length - 1; i >= 0; i--) {//遍历物品
            for (int j = 0; j <= V; j++) {
                // 选第i个物品
                int w1 = 0;
                if (j >= vw[i][0]) {
                    w1 = dp[i+1][j-vw[i][0]] + vw[i][1];
                } 
                int w2 = dp[i+1][j];
                dp[i][j] = Math.max(w1,w2);
            }
        }
        return dp[0][V];
    }

    public int maxW(int [][] vw, int index, int leftV) {
        if (index == vw.length) {
            return 0;
        }
        if (leftV < 0) {
            return 0;
        }
        int w1 = 0;
        if(leftV >= vw[index][0]) {
            w1 = maxW(vw, index+1, leftV - vw[index][0]) + vw[index][1];//选择第index个物品
        }
        int w2 = maxW(vw, index+1, leftV);// 不选第index个物品
        return Math.max(w1,w2);
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务