我正在寻找使用模数解决硬币找零问题的另一种方法。大多数解决方案都使用动态内存来解决此问题。
res.send('done') after
目标是使用模数创建解决方案。
这是到目前为止我尝试过的。我想知道我的变量是否应该初始化为0以外的值,或者我在代码块的错误部分进行更新。
Example:
You are given coins of different denominations and a total amount of
money amount. Write a function to compute the fewest number of coins
that you need to make up that amount. If that amount of money cannot be
made up by any combination of the coins, return -1.
Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
我期望输出如上。卡住了,不知道还有什么尝试使它起作用。
答案 0 :(得分:0)
我了解您要执行的操作,但是您的代码实际上并不会完成您认为将要完成的工作。这是您的代码细分:
int coinChange(vector<int>& coins, int amount) {
// Minimum number of coins to sum to 'amount'
int pieces = 0;
int remainder = 0;
// Assuming 'coins' is a non-decreasing vector of ints,
// iterate over all coins, starting from the larger ones,
// ending with the smaller ones. This makes sense, as it
// will use more coins of higher value, implying less
// coins being used
for(int i = coins.size()-1; i = 0; i--) {
// If what's left of the original amount is
// a multiple of the current coin, 'coins[i]',
if (amount % coins[i] == 0)
{
// Increase the number of pieces by the number
// of current coins that would satisfy it
pieces += amount/coins[i];
// ERROR: Why are you not updating the remaining amount?
} else {
// What's left of the original amount is NOT
// a multiple of the current coin, so account
// for as much as you can, and leave the remainder
pieces += amount/coins[i];
remainder = amount%coins[i];
amount = remainder;
}
}
// ERROR: What if amount != 0? Should return -1
return pieces;
}
如果您修复了我上面提到的ERROR
,则该函数将起作用,假设coins
中的所有整数的行为如下:
s
比另一个硬币l
小,则l
必须是s
的倍数。1的证明
如果一个硬币s
比另一个硬币l
小,但l
不是s
的倍数,则使用l
作为一个解决方案中的硬币可能不是一个好主意。让我们考虑一个示例,其中coins = [4, 7]
和amount = 8
。您将从coins
开始,以递增的顺序遍历7
。 7
适合8
,因此您将说pieces = 1
和amount = 1
仍然存在。现在,4
不适合amount
,因此您无需添加。现在for循环已经结束,amount != 0
,所以您使函数失败了。但是,一个可行的解决方案本来是4
的两个硬币,所以返回pieces = 2
。
2的证明
如果硬币c
<1,则可以为0或更小。如果c
为0,则将除以0并抛出错误。更令人困惑的是,如果您更改了代码,则可以添加无限数量的0硬币。
如果c
为负数,则将除以负数,从而得到负数,从而破坏了逻辑。