蓝桥杯 - 小明的背包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]);
    }
}
相关推荐
东方芷兰5 小时前
Agent 技术摘要 05 —— BP、SaaS、B2B、C2B、B2C
java·笔记·python·语言模型·自然语言处理
Chen—LSN5 小时前
数据结构——拿捏复杂度
java·c语言·开发语言·数据结构·经验分享·笔记·算法
一条破秋裤5 小时前
Linux 线程同步:条件变量
java·linux·jvm
Chen_harmony5 小时前
六、排序详解
c语言·数据结构·算法·排序算法
步行cgn5 小时前
Spring AOP 切面的先后顺序详解
java·spring
-dzk-5 小时前
【贪心算法】LC 55.跳跃游戏
算法·游戏·贪心算法
ofoxcoding5 小时前
Jev 模型评测深度解析:核心得分、能力局限与最佳适用任务场景
人工智能·算法·机器学习·ai
ym hyd 1115 小时前
宝宝早教服务系统源码 Java+SpringBoot+Vue3 前后分离
java·开发语言·spring boot
Evand J5 小时前
【MATLAB例程】三维A*路径规划与TOA-AOA-TDOA融合定位算法。附下载链接
数据库·算法·matlab
自强的小白6 小时前
微服务之间的依赖传递和调用(实体类的模块传递以及负载均衡的调用!)注册中心
java·微服务