我编写的代码使用动态编程解决了基本的硬币更改问题,并提供了进行更改所需的最少硬币数量。但是我希望将每个硬币播放部分的数量存储在最小数量中。
我要做的是初始化一个数组count[]
,就像哈希一样,每当找到coin[j]
时,它会增加min
的数量,即count[coin[j]]++
。
但这并不是我想要的方式,因为它每次找到与min
对应的coin[j]
时都会添加硬币。因此,数字不是最终答案中硬币的最终计数。
以下是代码:
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]);
}
答案 0 :(得分:1)
你必须保留一个额外的两个dinemsional数组来存储每个值和每个硬币面额的硬币数。
在内循环中指定新的最小值时,将所有硬币计数从i - coin[j]
复制到i,然后递增min_count[i][j]
。所需的硬币数量为coin_count[value]
。
答案 1 :(得分:0)
正如您已经指出的那样,自下而上的解决方案每次都会添加硬币,不仅仅是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);
};