题解 | #【模板】完全背包#

【模板】完全背包

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

和01背包的区别就是可以无限取一个物品,这样就要求外循环是容量,内循环是物品的种类

利用二维循环也是比较好理解

for (int i = 1; i <= n; i++) {
  for (int j = v[i]; j <= V; j++) {
    int num = j / v[i];
    for (int k = 1; k <= num; k++) {
      dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - k * v[i]] + k * w[i]);
    }
  }
}
import java.util.Arrays;
import java.util.Scanner;

/**
 * @program: springDemo
 * @author: JiaLe Hu
 * @create: 2022-03-18 16:02
 **/

public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();
        int V = reader.nextInt();
        int[] v = new int[n + 1];
        int[] w = new int[n + 1];

        for (int i = 1; i <= n; i++) {
            v[i] = reader.nextInt();
            w[i] = reader.nextInt();
        }
        // init
        int[] dp = new int[V + 1];
        Arrays.fill(dp, Integer.MIN_VALUE);
        dp[0] = 0;
        // dp[i][j] = dp[i - 1][j], dp[i - 1][j - nums * v[i]] + num * w[i];
        for (int i = 0; i <= V; i++) {
            for (int j = 1; j <= n; j++) {
                if (i >= v[j]) {
                    dp[i] = Math.max(dp[i], dp[i - v[j]] + w[j]);
                }
            }
        }
        int res = 0;
        for (int i = 1; i <= V; i++) {
            res = Math.max(res, dp[i]);
        }
        System.out.println(res);
        System.out.println(Math.max(dp[V], 0));
    }
}
全部评论

相关推荐

02-11 17:47
已编辑
门头沟学院 Java
神哥不得了:神哥来啦~建议先在网上找一些高频的八股去背,然后再去广泛的背八股,这样的学习会更有效率一些,简历的这两个项目建议换掉,换成两个高质量的项目,这样的话获得面试的比例会更高一点,专业技能的话排版要注意一下,要加句号的话就都加,要不加就都不加,荣誉奖项的话写在教育经历里边吧,这个确实没有太多的含金量
点赞 评论 收藏
分享
就用这个吧:支持多益再加一个空气使用费
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务