硬币变化 - 寻找最大数量

时间:2013-03-12 01:36:20

标签: java max knapsack-problem

我很难弄清楚如何解释这个问题。我正在尝试在我的编程课程中创建一个额外学分的程序,但我甚至不理解它背后的数学......所以如果有人可以帮助我,我会很高兴。好的:

假设您有1美分硬币和4美分硬币。允许的硬币总数为4.该值的最大覆盖率为11.图表如下。

Value | 1 cent | 4 cent
 1    | 1
 2    | 2
 3    | 3
 4    | 4
 5    | 1      | 1
 6    | 2      | 1
 7    | 3      | 1
 8    |        | 2
 9    | 1      | 2
10    | 2      | 2
11    | Maximum

S0就是一个例子。我需要为更大数量的东西做这件事。但如果有人可以帮我解释数学,我会很高兴。或者等式是什么......这让我疯了。

我试图实现一个版本的背包算法,但它似乎没有做到这一点。如果有人可以提供帮助,我将不胜感激。我不确定我是否能够这样做,或者我是否需要使用贪婪算法来解决这个问题。这基本上是对贪婪算法的一种扭曲。

编辑:改为11

2 个答案:

答案 0 :(得分:2)

动态编程(DP)是解决问题的方法。 DP通常涉及找到一些基于该属性的其他值可以计算的基本属性 - 一种归纳推理的形式。

在你的情况下,你需要问的基本问题是:“我可以使用恰好k个硬币赚取n美分”。这是一个简单的布尔值是/否;因为你可以重复使用硬币,你不需要知道如何n硬币制作k美分,只有这是可能的。这隐含地定义了一个布尔矩阵A[n][k],其中A[n][k] = TRUE如果您可以使用给定种类的硬币n获得k分。

研究此真值表中各个条目之间的关系。例如,如果我可以用2个硬币赚5美分,那么我可以用3个硬币制作6美分和9美分(为什么?);因此A[5][2]隐含A[6][3]A[9][3]

祝你好运!

答案 1 :(得分:1)

注意:我重新发布,因为在更新时删除了其他答案以提供更多上下文。

This似乎是最初的问题作者和他的Java源代码解决方案,如果您想进一步研究它。

但是,这里使用动态编程概述了该算法的工作原理:

<强>假设:
T中的每个值都受Integer.MAX_VALUE的限制 T约束Integer.MAX_VALUE -1

<强>解释
D = {d1, d2, ..., dk}∀ d∈ℤ, ∀ w_d = 1
T = W = Total Weight of Knapsack = Total Coins Available for Use

算法的工作原理:

  1. 通过W > 0
  2. 确保1 ∈ DMinCoins[0] = 0
  3. 确保满足上述限制
  4. 创建动态大小的数组n=1
  5. 允许n→∞并按MinCoins[ n ] = Integer.MAX_VALUE迭代1
    • 对于每次迭代,请设置d
    • 迭代 D 中的每个元素,让每个值在迭代期间称为d > n
      • 如果z跳过此次迭代
      • z = MinCoins [ n - d ] + 1代表此次迭代的最佳硬币数
      • 从上一次迭代中获取最佳硬币数量,并再添加一个(此值):z
      • 现在将MinCoins[ n ]z < MinCoins[ n ]
      • 进行比较
      • 如果d找到了新的最佳解决方案(保存),则迭代到下一个q = MinCoins[ n ]
    • 让此迭代的最佳解决方案定义为q < T
    • 如果 Something like this alexel, the name is associated with the select list rather than the options of the select list: <select name="amount"> <option value="" selected>How Many Candles?</option> <option value="100">100</option> <option value="150">250</option> <option value="500">500</option> <option value="1000">1,000</option> <option value="1500">1,500</option> <option value="2000">2,000</option> </select> 则继续下一次迭代。否则,这次迭代没有找到最大解决方案并打破循环。
  6. https://bitbucket.org/asraful/coin-change