0-1 背包问题及其 Java 实现


0-1 背包问题及其 Java 实现

概述

0-1 背包问题是动态规划领域的经典问题之一。在这个问题中,你给定一组物品,每个物品都有一个重量和一个价值,确定在不超过背包承载能力的前提下,如何选取物品以使得总价值最大化。

问题描述

假设有 n 个物品和一个容量为 W 的背包。第 i 个物品的重量为 weight[i],价值为 value[i]。0-1 背包问题的目标是选择一些物品放入背包中,以使得背包中物品的总价值最大,且总重量不超过背包的承载能力。

动态规划解法

我们可以使用动态规划来解决这个问题。基本思想是为每个物品 i(1 ≤ i ≤ n)和每个可能的背包容量 w(0 ≤ w ≤ W),计算在前 i 个物品中选择若干个放入容量为 w 的背包中可以获得的最大价值 dp[i][w]

状态转移方程

dp\[i\]\[w\] = \\max(dp\[i-1\]\[w\], dp\[i-1\]\[w-weight\[i\]\] + value\[i\])

  • 如果不选择第 i 个物品,dp[i][w] 就等于 dp[i-1][w]
  • 如果选择第 i 个物品,且其重量为 weight[i],那么 dp[i][w] 就等于 dp[i-1][w - weight[i]] + value[i]

Java 实现

以下是 0-1 背包问题的 Java 代码实现:

java 复制代码
public class Knapsack {
    public static void main(String[] args) {
        int[] weight = {10, 20, 30}; // 物品重量
        int[] value = {60, 100, 120}; // 物品价值
        int W = 50; // 背包容量
        int n = weight.length;

        int[][] dp = new int[n + 1][W + 1];

        for (int i = 1; i <= n; i++) {
            for (int w = 1; w <= W; w++) {
                if (weight[i - 1] <= w) {
                    dp[i][w] = Math.max(dp[i - 1][w], dp[i - 1][w - weight[i - 1]] + value[i - 1]);
                } else {
                    dp[i][w] = dp[i - 1][w];
                }
            }
        }

        System.out.println("最大价值为: " + dp[n][W]);
    }
}

代码解释

  1. 我们定义了两个数组 weightvalue 来存储物品的重量和价值。
  2. 背包的容量存储在变量 W 中。
  3. 创建一个二维数组 dp,其大小为 (n + 1) x (W + 1),用于存储动态规划的结果。
  4. 使用两层循环填充 dp 数组,外层循环遍历物品,内层循环遍历背包的所有可能容量。
  5. 根据状态转移方程计算 dp[i][w] 的值。
  6. 最终,dp[n][W] 存储了在不超过背包容量 W 的情况下,可以获得的最大价值。

结语

0-1 背包问题是理解动态规划思想的一个很好的例子。通过上述 Java 实现,我们可以有效地解决这个问题,并可以根据实际需求调整代码以适应不同的场景。


相关推荐
运维行者_1 天前
Applications Manager 引入持续剖析技术,突破传统 APM 监控瓶颈
java·运维·网络·jvm·数据库·安全·web安全
biyezuopinvip1 天前
基于JavaSSM+MySQL的机房预约管理系统设计与实现
java·mysql·毕业设计·论文·ssm·jsp·机房预约管理系统设计与实现
开开心心_Every1 天前
免费视频画质增强:智能超分辨率无损放大
java·服务器·前端·python·学习·edge·powerpoint
FJW0208141 天前
Python面向对象三大特征封装,继承,多态
开发语言·python
lbb 小魔仙1 天前
【Java】Java 实战项目:从零开发一个在线教育平台,附完整部署教程
java·开发语言
正在走向自律1 天前
时序数据管理:金仓数据库破局之道
java·后端·struts·时序数据库·金仓kes v9
七夜zippoe1 天前
Python算法优化实战:时间与空间复杂度的艺术平衡
开发语言·python·算法·贪心算法·动态规划·复杂度
全栈前端老曹1 天前
【前端】Hammer.js 快速上手入门教程
开发语言·前端·javascript·vue·react·移动端开发·hammer.js
学编程的小程1 天前
告别链接混乱❗️Sun-Panel+cpolar 让 NAS 服务远程一键直达
java·开发语言
青槿吖1 天前
【Java集合通关秘籍】从List到Set:解锁无序不重复的集合魔法✨
java·开发语言·算法