我如何解决 0-1 背包算法的这些变化?

How do i solve these variations of the 0-1 knapsack algorithm?

背包可以承载的最大重量,比如说max_wt;有 n 个给定重量 wt[] 和值 val[] 的物品。我有两个问题(两个问题彼此分开):

我的尝试

p.s 请尝试为第二个问题提供一个自下而上的解决方案,我是动态规划的新手。 ;)

二维背包问题

  • n为项目数
  • val[i] 为第 i 项的值
  • w[i] 为第 i 项的重量
  • v[i] 为第 i
  • 的体积
  • T[i,j,k] 成为前 i 项中的最佳值,并且具有 完全 重量 j 和体积 k. T 可以用其他方式定义,但这个定义给出了一个简短的公式。

寻找最佳价值

  • T[0,j,k] = 0

  • T[i,j,k] = T[i-1,j,k],当j<w[i]k<v[i]时,否则:

  • T[i,j,k] = max( T[i-1,j,k] , T[i-1,j-w[i],k-i] + val[i] )

  • 对于所有 j 和 k

  • ,最佳可能值为最大值 T[n,j,k]

实施说明

  • 首先为所有 jk

  • 初始化基本案例
  • 从1到n循环i并与基于1的数组索引一致

  • 循环 j 从 1 到最大可能权重,这是所有权重的总和,例如w[1]+w[2]+...w[n]

  • 循环 k 从 1 到最大可能音量

计算使用准确数量的项目获得准确值的方法数量

  • S[i,j,k,l] 为第一个 i 项可以精确排列的方式数 j,值 k,和 l 项。

  • S[0,j,k,l] = 0,除了 S[0,0,0,0] = 1

  • S[i,j,k,l] = S[i-1,j,k,l] + S[i-1,j-w[i],k-val[i],l-1]

  • 使用 z 项获得精确值的方法数 y 是所有 j[=46= 的 T[n,j,y,z] 的总和]

观察

有很多方法可以查看这些问题并定义状态 T 和 S。这只是其中之一。实现也可能不同。维度的经验法则是袋子中的另一个约束或项目中的维度意味着公式中的另一个维度。计算方法的经验法则是你加起来而不是找到最大值。