Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 硬币兑换-寻找最大数量_Java_Max_Knapsack Problem - Fatal编程技术网

Java 硬币兑换-寻找最大数量

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 |

我很难弄明白如何解释这个问题。我目前正试图在我的编程课上创建一个额外学分的程序,但我甚至不懂它背后的数学。。。。所以如果有人能帮我,我会很高兴的。好的:

假设你有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美分吗?”。这是一个简单的布尔是/否;因为你可以重复使用硬币,你不需要知道如何用
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,但我不确定这是否有效。