所有可能的硬币组合

Posted

技术标签:

【中文标题】所有可能的硬币组合【英文标题】:All possible combinations of coins 【发布时间】:2016-02-03 18:17:59 【问题描述】:

我需要编写一个程序,在给定面额数组 [1 , 2, 5, 10, 20, 50, 100, 200] // 1 = 1 cent

的情况下显示所有可能的变化组合

从 = 300 进行更改的值

我的代码基于该站点http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/的解决方案

#include<stdio.h>

int count( int S[], int m, int n )

   int i, j, x, y;

   // We need n+1 rows as the table is consturcted in bottom up manner using 
   // the base case 0 value case (n = 0)
   int table[n+1][m];

   // Fill the enteries for 0 value case (n = 0)
   for (i=0; i<m; i++)
      table[0][i] = 1;

   // Fill rest of the table enteries in bottom up manner  
   for (i = 1; i < n+1; i++)
   
       for (j = 0; j < m; j++)
       
           // Count of solutions including S[j]
           x = (i-S[j] >= 0)? table[i - S[j]][j]: 0;

           // Count of solutions excluding S[j]
           y = (j >= 1)? table[i][j-1]: 0;

           // total count
           table[i][j] = x + y;
       
   
   return table[n][m-1];


// Driver program to test above function
int main()

   int arr[] = 1, 2, 5, 10, 20, 50, 100, 200; //coins array
   int m = sizeof(arr)/sizeof(arr[0]);
   int n = 300; //value to make change from
   printf(" %d ", count(arr, m, n));
   return 0;

程序运行良好。它显示所有可能组合的数量,但我需要它更高级。我需要它的工作方式是以下列方式显示结果:

1 美分:n 种可能的组合。

2 美分:

5 美分:

等等……

如何修改代码来实现这一点?

【问题讨论】:

当你说:1 美分:n 种可能的组合你的意思是有多少组合使用 1 美分硬币?如果是这样,请添加一个计数器数组,每次到达 table[i][j] = x + y; 时,您都需要更新这些计数器 是的,我需要它来显示每个硬币可以有多少组合的信息。例如 1 美分:1251251 种组合 2 美分:432423 种组合等 计数器数组和硬币数组的大小应该相等吗?每个计数器对应一个硬币? @KoKsMAN 如果你有工作代码并想知道如何改进它,请在SE Code Review提问。 @πάνταῥεῖ 他正在为一个非常具体的问题寻找解决方案,所以这里是主题。将其移至Code Review 毫无意义。 【参考方案1】:

贪心算法方法

将这个面额放在一个 int 数组中,比如 int den[] = [1 , 2, 5, 10, 20, 50, 100, 200]

遍历这个数组

对于每次迭代,请执行以下操作

取面额数组中的元素

用面额数组中的元素除以要分配的数字

如果分配的找零号码完全可以被面额数组中的数字整除,那么您就完成了该号码的找零。

如果这个数不能完全整除,则检查余数并对其他数进行相同的迭代

一旦获得等于更改数的值,退出内部迭代

对我们的面额数组中的下一个面额执行相同的操作。


Explained with example
den = [1 , 2, 5, 10, 20, 50, 100, 200]
Change to be alloted : 270, let take this as x
and y be the temporary variable
Change map z[coin denomination, count of coins]

int y, z[];
First iteration : 
den = 1
x = 270
y = 270/1;
if x is equal to y*den
 then z[den, y] // z[1, 270]
Iteration completed

Second Iteration:
den = 2
x = 270
y = 270/2;
if x is equal to y*den
 then z[den , y] // [2, 135]
Iteration completed

Lets take a odd number
x = 217 and den = 20
y= 217/20;
now x is not equal to y*den
then update z[den, y] // [20, 10]
find new x = x - den*y = 17
x=17 and identify the next change value by greedy it would be 10
den = 10
y = 17/10 
now x is not equal to y*den
then update z[den, y] // [10, 1]
find new x = x - den*y = 7

then do the same and your map would be having following entries
[20, 10]
[10, 1]
[5, 1]
[2, 1]

【讨论】:

以上是关于所有可能的硬币组合的主要内容,如果未能解决你的问题,请参考以下文章

确定硬币组合的算法

给定一些美元价值时如何找到所有硬币组合[关闭]

如果给出一些美元价值,如何找到所有硬币组合

所有硬币组合问题——动态规划hdu2069

统计硬币

硬币面值组合