硬币变化问题

时间:2015-04-10 16:42:17

标签: c++ dynamic-programming coin-change

假设我有4个面额硬币1 3 4 5.我想做到7.我学会了如何找到可以做多少种可能的方法。但我想确定必须使用的最小硬币数量是多少。示例:5 + 1 + 1 = 7再次3 + 4 = 7。所以硬币的最小数量是2.任何伪代码或解释或源代码都会有用

2 个答案:

答案 0 :(得分:0)

如果要更改数字n,请设置数组number_of_coins [n]并从左到右填充。显然,number_of_coins [0]为0。接下来的几个你可以手动完成(虽然一旦你有一个算法,它将自动填充它们)。要在数组中填入更大的条目m,请考虑一下:如果我从m中删除1美分怎么办?还是3美分?还是4美分?还是5美分?

一旦你的硬币数量达到n,你可以向后走过它,找到准确使用的硬币。

答案 1 :(得分:0)

我会捅它。我认为你应该定义你的面额的矢量:

vector<int> denominations {1,3,5,7};
从那里开始,写一个递归函数,它接受面额,以及面额的数量:

int recursive_totals(const vector<int> denominations, int amount_to_make);

如果amount_to_make小于或等于0,则此函数将返回0,否则将循环通过面额:

int sum_totals = 0;
for (int denom : denominations)
{
    if (amount_to_make - denom == 0)
        sum_totals+=1;
    else
        sum_totals+=recursive_totals(denominations, amount_to_make - denom);
}

这是粗略的代码,可能需要调整,但我认为递归函数在这里工作。我看到的一个直接问题是,顺序与我在这里写的方式无关,你可以得到重复,但有办法解决这个问题。

编辑:我得到了它的工作,但不会在这里发布代码。这种方法有效,如果您选择尝试,请随时提出您需要的任何问题,我会尽力提供帮助。