题解 | 【模板】完全背包

【模板】完全背包

https://www.nowcoder.com/practice/237ae40ea1e84d8980c1d5666d1c53bc

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 = w[i]; j <=V; ++j) {//完全背包是指物品不限量的情况下,此时可以升序遍历。限1件物品的时候需要降序遍历(后面的元素先改变而不影响前面的元素)。
                dp1[j] = Math.max(dp1[j - w[i]] + v[i], dp1[j]);
            }
        }

        // 求解问题二
        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 = w[i]; j<=V; ++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]);
    }
}

全部评论

相关推荐

白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
01-12 17:45
门头沟学院 Java
叁六玖:这样的应该钱不多,以前我也被问,我在问他们实习公工资多少,一般都是2200-2800
找实习记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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