java - 硬币找零 - 寻找最大数量

标签 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

最佳答案

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

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

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

祝你好运!

关于java - 硬币找零 - 寻找最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15351800/

相关文章:

java - 如何在 jgraphx 的图形中制作所需形式的边缘?

java - 我的二进制搜索算法实现有什么问题?

Mysql:获取相应时间的最大值并按天分组

mysql - 多列和排序

python - 按长度查找匹配组的轨道

java - 如何用Java实现子集和问题

java - 程序跳过输入之一

java - 按空格分割字符串并忽略句点

java - 最小化捆绑更新的成本(反向背包?)

mysql - 如何在MySQL中选择多门相同类(class)的最高分?