当前位置: 首页 > 知识库问答 >
问题:

动态规划-给定金额所需的最小硬币数

康文昌
2023-03-14

在研究硬币更换问题后,我尽力实施解决方案。到目前为止,我的代码打印了给定金额所需的最低硬币数量。然而,它并不打印出每种硬币面额所需的数量。这是我的代码目前的样子:

public class Coins {

    static int minCoins(int coinValues[], int m, int target) {
       int[] totalCoins = new int[target + 1];
       int[][] numOfCoins = new int[target + 1][m];

       totalCoins[0] = 0;

       for (int i = 1; i <= target; i++) {
           totalCoins[i] = Integer.MAX_VALUE;
       }

       for (int i = 1; i <= target; i++) {
           for (int j = 0; j < m; j++) {
               if (coinValues[j] <= i) {
                   int previous = totalCoins[i - coinValues[j]];
                   if (previous != Integer.MAX_VALUE && previous + 1 < totalCoins[i]) {
                       totalCoins[i] = previous + 1;
                   }
               }
           }
       }

       return totalCoins[target];
    }

    public static void main(String args[]) {
       int coinValues[] =  {1, 5, 10, 20};
       int m = coinValues.length;
       int target = 26;
       System.out.println("Minimum coins required is "+ minCoins(coinValues, m, target) );
    }
}

我只是很困惑如何/在哪里填充numOfCoins[]。

共有2个答案

侯池暝
2023-03-14

@user1523236提供了不能解决一般情况的贪婪方法。例如,如果去掉1面额并计算8的变化。

请看一下,比如4.12。动态规划,或CMP的动态规划算法(变更问题)。这两个参考文献都提供了通用的动态编程算法。

胥博文
2023-03-14

我在Groovy中使用欧元面值实现的解决方案

class coinage {

def denoms = [1, 2, 5, 10, 20, 50, 100, 200]
def resultArray = []
def remainder
def largest
def newResult

def calculate(int amt) {
    def value = denoms.findAll({ element -> element <= amt})
    largest = value.last()
    resultArray.add(largest)
    remainder = amt - largest

    if (remainder == 0 || remainder == amt) {
        newResult = resultArray.size()
        println("Minimum number of coins required for this is: $newResult")
    } else
        calculate(remainder)
}

}

并称之为:

coins = new coinage()
coins.calculate(305)
 类似资料:
  • 给定一组面额和所需的总和我必须找到最低数量的硬币使该总和以及硬币的数量为每个面额 请帮忙!!

  • 问题-你会得到不同面额的硬币和总金额。写一个函数来计算你需要的最少数量的硬币来组成这个数量。那里有无限的硬币供应。 我的方法——我遵循了自上而下的方法,但是使用map stl进行记忆,我得到了TLE。请帮助找出误差和估计时间复杂度。 这是我的密码-

  • 我编写的代码使用动态规划解决了基本的硬币兑换问题,并给出了进行兑换所需的最小硬币数量。但是我想把每个硬币的数量存储在最小的数字里。 我试图做的是初始化数组,就像散列一样,只要找到,它就会增加的数量,即。但这并不是我想要的方式,因为它每次发现对应于时都会添加硬币。因此,在最终答案中,数字不是硬币的最终计数。 代码如下:

  • 但是我们不能这样做吗:(是给定的可用硬币的排序集,和是它的下标,是给定的最高价值硬币) 我写的东西有什么问题吗?虽然解决方案不是动态的,但不是更有效吗?

  • 在硬币系统C={c1,c2,…ck}中,应改变给定的数量x,以使每个硬币ci具有给定的重量wi。我们想计算可能变化的总重量。两种变化是不同的,如果他们包含在不同的顺序相同的硬币。 如何给出上述问题的动态规划递归?我知道最小硬币兑换问题的递归(即C(x)=min{C(x-C)1 for x

  • 这是我关于硬币更换问题的代码,用于打印一组硬币的总方式数和目标金额 我想知道是否有任何方法可以用相同的动态规划解决方案打印这些方法(借助内部构造的表或任何其他方法) 例如,如果一组硬币是[1,3,5],目标金额是6,那么总共有4种可能的方式。[1,1,1,1,1,1,1,],[1,1,1,3],[3,3],[1,5]]我希望这种方式的列表作为输出。