【问题标题】:Dynamic Programming: Why can't we solve minimum no. of coins required to form a change with the concept of 0/1 knapsack?动态规划:为什么我们不能解决最小编号。用 0/1 背包的概念形成零钱需要多少硬币?
【发布时间】:2016-01-10 08:14:12
【问题描述】:

0/1背包的概念- 使用给定的重量装满 W 重量的背包。目的是使利润最大化。 Ans-Problem 可以通过采用特定权重或不采用特定权重来解决,具体取决于哪个获得最大利润。通过这种方式可以计算出最优解。

现在,最小硬币找零问题 - 找到最小号码。硬币做出特定的改变。 Ans-根据我的想法,可以通过取或不取特定硬币来解决,这取决于哪一个给出的最小值。硬币。 只有 0/1 背包的最大值条件会被反转。

但在实际的解决方案中是这样的—— Answer given on geeksforgeeks

现在,最小硬币找零问题的变化——我们必须为特定找零找到所有可能的硬币组合,遵循背包的概念。我不明白为什么??

like here it is done-

请帮助我理解为什么我的背包思维过程在最低限度内不起作用。硬币做出特定的改变。 我哪里错了? 还是我对0/1背包的概念有误,如果有,请解释一下。

【问题讨论】:

  • 您可以多次挑选硬币,这与 0/1 背包不同。否则,我看不出问题出在哪里——第一篇链接文章中的 DP 与 Knapsack DP 基本相同,除了你已经提到的那个变化(即你想要最小化而不是最大化),以及所有权重均为 1 的事实。

标签: algorithm recursion dynamic-programming memoization array-algorithms


【解决方案1】:

此代码给出了在动态规划中使用 0/1 背包概念的最小硬币找零解决方案。在这里,我将要填充的二维矩阵的第 0 行初始化为 Integer.MAX_VALUE-1 并更新了每个面额条目的值,以相应地在问题中求和。矩阵的最后一个元素给出了解决方案,即达到总和的最小硬币数量。如果通过给定的面额没有得到适当的总和,我返回-1。

public static int coinsChange(int denomination[],int sum){
    Arrays.sort(denomination);
    int[][] coins = new int[denomination.length+1][sum+1];
    for(int sumIdx = 0; sumIdx<= sum;sumIdx++){
          coins[0][sumIdx] = Integer.MAX_VALUE-1;
    }
    for(int i =1;i<=denomination.length;i++){
        for(int j = 1;j<=sum;j++){
            if(j>=denomination[i-1]){
                coins[i][j]=Integer.min(coins[i-1][j],coins[i][j-denomination[i-1]]+1);
             }
            else{
                coins[i][j] = coins[i-1][j];
             }

        }
   }
   if (coins[denomination.length][sum] == Integer.MAX_VALUE-1){
        System.out.println("No solution found");
        return -1;
    }

   return coins[denomination.length][sum];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多