【问题标题】:Coin Change :Dynamic Programming硬币变化:动态编程
【发布时间】:2014-05-09 06:04:57
【问题描述】:

我编写的代码使用动态编程解决了基本的硬币找零问题,并给出了找零所需的最小硬币数量。但是我想将每个硬币的数量存储在最小数量中。

我要做的是初始化一个数组count[],就像散列一样,只要找到min,它就会增加coin[j]的数量,即count[coin[j]]++。 但这不是我想要的方式,因为它每次找到对应于coin[j]min 时都会添加硬币。因此,该数字不是最终答案中硬币的最终计数。

代码如下:

void makeChange(int coin[], int n, int value)
{
    int i, j;
    int min_coin[MAX];
    int min;

    int count[MAX];
    min_coin[0] = 0;

    for (i=1; i <= value; i++)
    {
            min = 999;
            for (j = 0; j<n; j++)
            {
                    if (coin[j] <= i)
                    {
                            if (min > min_coin[i-coin[j]]+1)
                            {
                                    min = min_coin[i-coin[j]]+1;
                                    count[coin[j]]++;
                            }
                    }
            }
            min_coin[i] = min;
    }

    printf("minimum coins required %d \n", min_coin[value]);

}

【问题讨论】:

    标签: c dynamic-programming coin-change


    【解决方案1】:

    您必须保留一个额外的二元数组来存储每个值和每个硬币面额的硬币计数。

    当您在内部循环中分配新的最小值时,将所有硬币计数从 i - coin[j] 复制到 i,然后递增 min_count[i][j]。然后需要的硬币数量在coin_count[value]

    【讨论】:

      【解决方案2】:

      正如您已经指出的,自下而上的解决方案每次都添加硬币,不仅在i == value时,而且如果您想知道i == value时的硬币数量,这取决于硬币的数量子问题,所以我们需要用二维数组存储以前的计算:

      #include <stdio.h>
      
      #define MAX 1000
      #define COIN_ARRAY_SIZE 4
      
      void makeChange(int coin[], int n, int value)
      {
          int i, j, k;
          int min_coin[MAX];
      
          int count[MAX + 1][COIN_ARRAY_SIZE] = {0}; // zeroing
          int min;
      
          //int count[MAX];
          min_coin[0] = 0;
      
          for (i=1; i <= value; i++)
          {
              min = 999;
              for (j = 0; j<n; j++)
              {
                  if (coin[j] <= i)
                  {
                      if (min > min_coin[i-coin[j]]+1)
                      {
                          min = min_coin[i-coin[j]]+1;
                          for(k = 0; k < n; ++k)
                          {
                              count[i][k] = count[i-coin[j]][k]; // copy coin counts when value=i-coin[j]
                          }
                          count[i][j]++; // use a coin[j], increase the count
                      }
                  }
              }
              min_coin[i] = min;
          }
      
          printf("minimum coins required %d \n", min_coin[value]);
          for(int i = 0; i < COIN_ARRAY_SIZE; ++i)
              printf("%d: %d\n", coin[i], count[value][i]);
      
      }
      

      测试上述功能的驱动程序:

      int main()
      {
          int coin[COIN_ARRAY_SIZE] = {5,3,2,1};
          makeChange(coin, 4, 8);
          makeChange(coin, 4, 10);
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2018-02-25
        相关资源
        最近更新 更多