Java 硬币兑换-寻找最大数量
我很难弄明白如何解释这个问题。我目前正试图在我的编程课上创建一个额外学分的程序,但我甚至不懂它背后的数学。。。。所以如果有人能帮我,我会很高兴的。好的: 假设你有1分硬币和4分硬币。允许的硬币总数为4枚。该值的最大覆盖范围为11。图表如下Java 硬币兑换-寻找最大数量,java,max,knapsack-problem,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 |
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动态规划(DP)是解决问题的方法。DP通常涉及找到一些基本属性,您可以根据该属性的其他值进行计算,这是归纳推理的一种形式
在你的例子中,你需要问的基本问题是:“我能用k个硬币赚n美分吗?”。这是一个简单的布尔是/否;因为你可以重复使用硬币,你不需要知道如何用k
硬币制造n
美分,只需要知道是否可能。这隐式地定义了一个布尔矩阵a[n][k]
,其中a[n][k]=TRUE
iff您可以用给定种类的硬币k
制造n
美分
研究此真值表中各个条目之间的关系。例如,如果我可以用2枚硬币赚5美分,那么我可以用3枚硬币分别赚6美分和9美分(为什么?);因此A[5][2]
意味着A[6][3]
和A[9][3]
祝你好运 注意:我之所以重新发布,是因为另一个答案在更新以提供更多上下文时被删除 如果您想进一步研究的话,可能是问题的原始作者和他的Java源代码解决方案 但是,下面是使用动态规划的该算法工作原理的总结: 假设:
T
中的每个值都受整数约束。最大值
T
受Integer.MAX\u值-1约束
定义:
D={d1,d2,…,dk}∀ D∈ℤ, ∀ w_d=1
T=W=背包总重量=可用硬币总数
算法的工作原理:
确保W>0
和1∈ D
确保满足上述约束条件
创建一个动态大小的数组MinCoins[0]=0
让n=1
并以1作为n进行迭代→∞代码>
- 对于每次迭代,设置
MinCoins[n]=Integer.MAX\u值
- 迭代D中的每个元素,让每个值在迭代期间称为
D
- 如果
d>n
跳过此迭代
- 让
z
表示此迭代的最佳硬币数量
- 从上一次迭代中获得硬币的最佳数量,并向其中再添加一个(此值):
z=MinCoins[n-d]+1
- 现在将
z
与MinCoins[n]
- 如果
z
找到了一个新的最佳解决方案(保存),否则迭代到下一个d
- 让为该迭代找到的最佳解决方案定义为
q=MinCoins[n]
- 如果
q
,则继续下一次迭代。否则,在这个迭代中找不到最大解并打破循环
你所说的“最大覆盖率”是什么意思?你怎么知道13号?这个问题需要理解。这也是一个很好的教程。对不起,我是说11。那是个打字错误。我刚修好。下面的Ajmartin建议了解动态编程,所以我现在正在研究。所以它基本上是连续数,直到它达到零。作为代码,我试图用数组D[]中最大的硬币除以V值,然后将D[I]中的许多硬币添加到数组中,数组中包含了你用来获得值的硬币,然后移动到下一个面额的D[]重复这个操作,直到除法的剩余部分为0,但我不确定这是否有效。