蓝桥杯 - 小明的背包2(完全背包)

解题思路:

本题属于完全背包问题,背包内物品可以重复,使用动态规划

dp j 表示容量为 j 的背包的最大价值

注意:

需要时刻提醒自己dp j 代表的含义,不然容易晕头转向

注意越界问题,且 j 需要正序遍历

如果正序遍历

dp1 = dp1 - volume\[0] + value0 = 15

dp2 = dp2 - volume\[0] + value0 = 30

此时dp2就已经是30了,意味着物品0,被放入了两次,因为可以重复,所以需要正序遍历。

为什么倒叙遍历,就可以保证物品只放入一次呢?

倒叙就是先算dp2

dp2 = dp2 - volume\[0] + value0 = 15 (dp数组已经都初始化为0)

dp1 = dp1 - volume\[0] + value0 = 15

所以从后往前循环,每次取得状态不会和之前取得状态重合,这样每种物品就只取一次了。

java 复制代码
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int V = scan.nextInt();
        int[] volume = new int[N];
        int[] value = new int[N];
        for (int i = 0; i < N; i++) {
            volume[i] = scan.nextInt();
            value[i] = scan.nextInt();
        }
 
        int[] dp = new int[V + 1];
        for (int i = 0; i < N; i++) {
            for (int j = volume[i]; j <= V; j++) {
                dp[j] = Math.max(dp[j], dp[j - volume[i]] + value[i]);
            }
        }
        System.out.println(dp[V]);
    }
}
相关推荐
方也_arkling15 小时前
【Java-Day08】static / final / 枚举
java·开发语言
橙淮15 小时前
Spring Bean作用域与生命周期全解析
java·spring
Chengbei1116 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_11216 小时前
web-第一次课后作业
java·开发语言·idea
kkeeper~16 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
秋916 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本16 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
DIY源码阁16 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse
wabs66617 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_8769641317 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉