Java数据结构与算法(完全背包)

前言:

完全背包问题是背包问题的一个变种,与0/1背包问题不同,在完全背包问题中,每种物品可以被选取多次。问题描述如下:

给定 n 件物品,每件物品有一个重量 wi和一个价值 vi,以及一个背包,它能够承载的最大重量为 W。我们需要确定应该将哪些物品放入背包,以使得背包内物品的总价值最大。

背包问题分类:

解题思路:

动态规划是解决完全背包问题的常用方法。我们可以通过修改0/1背包问题的动态规划方法来实现。

核心思想: 构建一个一维数组 dp[j],其中 j 表示当前背包容量。dp[j] 表示容量为 j 的背包中可以获得的最大价值。

状态转移方程:

  • 如果选择第 i件物品:dp[j] = max(dp[j], dp[j - wi] + vi)

实现代码

java 复制代码
public class CompleteKnapsack {
    public static int completeKnapsack(int W, int[] weights, int[] values, int n) {
        int[] dp = new int[W + 1];

        for (int i = 0; i < n; i++) {
            for (int j = weights[i]; j <= W; j++) {
                dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);
            }
        }
        return dp[W];
    }

    public static void main(String[] args) {
        int W = 50; // 背包容量
        int[] weights = {10, 20, 30}; // 物品重量
        int[] values = {60, 100, 120}; // 物品价值
        int n = values.length;

        System.out.println("最大价值: " + completeKnapsack(W, weights, values, n));
    }
}

QA1:0/1背包和完全背包dp设计的差异作用?

dp[i]的作用就是用于区分一个物品能否重复放置,具体获取的值可以输出打印细细体会。

相关推荐
Hello--_--World5 分钟前
ES16:Set 集合方法增强、Promise.try、迭代器助手、JSON 模块导入 相关知识
开发语言·javascript·json
小Y._10 分钟前
AQS同步器核心原理深度剖析
java·源码分析·juc·aqs
南棱笑笑生16 分钟前
20260420给万象奥科的开发板HD-RK3576-PI适配瑞芯微原厂的Buildroot时使用ll命令
java·大数据·elasticsearch·rockchip
StockTV20 分钟前
韩国市场API技术对接指南,涵盖实时行情、历史数据、指数信息、公司详情等功能
java·开发语言·python·php
penngo29 分钟前
用 Claude Code 开发多人猜拳游戏:Go 语言实践
开发语言·游戏·golang
xiaoshuaishuai833 分钟前
C# 实现不掉线的CRM
开发语言·c#
YuanDaima204834 分钟前
大语言模型生命周期全链路解析:从架构基石到高效推理
开发语言·人工智能·python·语言模型·架构·transformer
缪懿1 小时前
javaEE:文件IO
java·java-ee
小Y._1 小时前
ConcurrentHashMap高效并发机制深度解析
java·并发·juc·concurrenthashmap
tang_jian_dong1 小时前
springboot + vue3 集成tianai.captcha验证码
java·spring boot·spring