所有可能的硬币组合
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]
【讨论】:
以上是关于所有可能的硬币组合的主要内容,如果未能解决你的问题,请参考以下文章