题解 | 【模板】01背包

【模板】01背包

https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), V = in.nextInt();//n and Volume
        // 这里我把价值和重量的字母正常写了,而非像题目那样有点反直觉
        int []v=new int [n];//value
        int []w=new int [n];//weight
        for(int i=0;i<n;++i){
            w[i] = in.nextInt();
            v[i] = in.nextInt();
        }
        //dp[i]表示在容量为i时的最大价值
        //求解问题一
        int []dp1 = new int [V+1];
        for(int i=0;i<n;++i){
            for(int j=V;j>=w[i];--j){
                dp1[j] = Math.max(dp1[j-w[i]]+v[i], dp1[j]);
            }
        }

        // 求解问题二,从价值最大为1000,可以看出只有刚好装满才能在不累加int最小值的情况大于0.
        int []dp2 = new int [V+1];
        Arrays.fill(dp2, Integer.MIN_VALUE);
        dp2[0] = 0;
        for(int i=0;i<n;++i){
            for(int j=V;j>=w[i];--j){
                dp2[j] = Math.max(dp2[j-w[i]]+v[i], dp2[j]);
            }
        }
        if(dp2[V] < 0)
            dp2[V] = 0;//无解

        System.out.println(dp1[V]+"\n"+dp2[V]);
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
迷茫的大四🐶:自信一点,我认为你可以拿到50k,低于50k完全配不上你的能力,兄弟,不要被他们骗了,你可以的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务