我很难弄清楚如何解释这个问题。我正在尝试在我的编程课程中创建一个额外学分的程序,但我甚至不理解它背后的数学......所以如果有人可以帮助我,我会很高兴。好的:
假设您有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
答案 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
算法的工作原理:
W > 0
1 ∈ D
和MinCoins[0] = 0
n=1
n→∞
并按MinCoins[ n ] = Integer.MAX_VALUE
迭代1
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>
则继续下一次迭代。否则,这次迭代没有找到最大解决方案并打破循环。