假设我有4个面额硬币1 3 4 5.我想做到7.我学会了如何找到可以做多少种可能的方法。但我想确定必须使用的最小硬币数量是多少。示例:5 + 1 + 1 = 7再次3 + 4 = 7。所以硬币的最小数量是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);
}
这是粗略的代码,可能需要调整,但我认为递归函数在这里工作。我看到的一个直接问题是,顺序与我在这里写的方式无关,你可以得到重复,但有办法解决这个问题。
编辑:我得到了它的工作,但不会在这里发布代码。这种方法有效,如果您选择尝试,请随时提出您需要的任何问题,我会尽力提供帮助。