动态规划(多重背包) 一维优化附图理解

这篇博客介绍了如何使用动态规划解决多重背包问题,其中物品数量有限。通过两种不同的方法实现,包括朴素的二维状态DP和一维优化的DP。代码示例展示了如何找到在不超过背包容量的情况下,选择物品以最大化总价值的过程。
摘要由CSDN通过智能技术生成

动态规划——多重背包

题目描述

有 n 种物品和一个容量为 capacity 的背包,且每种物品【数量有限】。

第 i 件物品的质量是 weight[i] ,价值是 values[i] ,数量为 nums[i]。

问:选择哪些物品,每种物品选择多少件,可使得总价值最大?

输入:capacity = 5 , weight = [1,2] , values = [1,2] , nums = [2,1]
输出:4
选择两件物品1,再选一件物品2,可以使价值最大

朴素二维

  1. 状态定义 dp[i] [j] :考虑前 i 件物品。且所选物品总体积不超过 j 时获得的最大价值,且物品数量不能超
  2. 状态转移方程 dp[i] [j] = max(dp[i-1] [j] , dp[i-1] [j - k * value(i)] + k * value(i) ) 0 < k <= s[i] 0 < k * value(i) <= j
  3. 初始化 maxK = math.min(j/ weight(i) , s[i]) dp[0] [j] = maxK * value(i) 能装多少装多少

代码如下:

public int maxValue( int capacity, int[] nums, int[] weight, int[] values){
   
        int n = nums.length;
        int[][] dp = new int[n][capacity+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值