题解 | #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[][] dp = new int[n+1][V+1];
	  //dp[i][j]:对于前i个物品,背包容量为j时,能装载的最大价值
	  //例子:dp[3][5]=6:对于前3个物品,背包容量为5时,能装载的最大价值为6
	  //dp[0][...]=0;dp[...][0]=0
        for(int i=1;i<=n;i++)//循环n个物品
        {
            for(int j=1;j<=V;j++)//循环背包容量
            {
                if(j<vw[i-1][0])//第i个物品装不下
                {
                    dp[i][j]=dp[i-1][j];
                }
                else//第i个物品能装下
				  //不装:dp[i][j]=dp[i-1][j];
				  //装:dp[i][j]=dp[i-1][j-vw[i-1][0]]+vw[i-1][1],因为你选择了要装第i个物品,所以肯定要加第i个物品的价值vw[i-1][1],相当于你把前i-1个物品,撞到了容量为j-vw[i-1][0]的背包里
                {
                    dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-vw[i-1][0]]+vw[i-1][1]);
                }
            }
        }
        return dp[n][V];//前n个物品,背包容量为V

    }
}

全部评论

相关推荐

11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务