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

解题思路:

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

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

注意:

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

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

如果正序遍历

dp[1] = dp[1 - volume[0]] + value[0] = 15

dp[2] = dp[2 - volume[0]] + value[0] = 30

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

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

倒叙就是先算dp[2]

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

dp[1] = dp[1 - volume[0]] + value[0] = 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]);
    }
}
相关推荐
.生产的驴8 分钟前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
猿周LV16 分钟前
JMeter 安装及使用 [软件测试工具]
java·测试工具·jmeter·单元测试·压力测试
知来者逆18 分钟前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
晨集18 分钟前
Uni-App 多端电子合同开源项目介绍
java·spring boot·uni-app·电子合同
时间之城20 分钟前
笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)
java·spring boot·笔记·spring·excel
阿让啊22 分钟前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北23 分钟前
力扣-160.相交链表
算法·leetcode·链表
椰羊~王小美28 分钟前
LeetCode -- Flora -- edit 2025-04-25
java·开发语言
凯酱35 分钟前
MyBatis-Plus分页插件的使用
java·tomcat·mybatis
程序员总部1 小时前
如何在IDEA中高效使用Test注解进行单元测试?
java·单元测试·intellij-idea