凑零钱问题

冷不防 2023-02-17 01:15 91阅读 0赞

题目:给你k种面值的硬币,面值分别为 c1, c2 … ck,每种硬币的数量无限,再给一个总金额 amount,问你amount 最少需要几枚硬币凑出这个金额,如果不可能凑出,算法返回 -1

解析:假设面值c1,c2…ck是顺序排列,首先我们查看cK,最大可能 maxCout = amount /ck 个ck。那么剩下的钱amount - maxCout *ck从c1,c2…ck-1。如果凑不齐,最大面值ck就从maxCout -1个开始。剩下的钱amount - ( maxCout - 1) *ck从c1,c2…ck-1凑。如果最后最大面额ck个数为0,剩余钱amount 从c1,c2…ck-1凑也没有凑齐,那就是真凑不齐了。

来看下代码实现

  1. int countCoins(vector<int> coins,int amount)
  2. {
  3. if ( 0 == amount)
  4. {
  5. return 0;
  6. }
  7. if ((coins.size() == 0) || ((coins.size() != 0) && (amount < coins.at(0))))
  8. {
  9. return -1;
  10. }
  11. int maxCoins = coins.at(coins.size() - 1);//最大面额
  12. int minMaxCoins = amount / maxCoins;// 最大面额的最多张数
  13. int num = minMaxCoins;
  14. int otherCoins = -1;
  15. coins.pop_back();
  16. //剩下的钱amount - (num) *ck从c1,c2...ck-1凑
  17. for ( ; num >= 0; num-- )
  18. {
  19. otherCoins = countCoins(coins,amount - num * maxCoins);
  20. if (otherCoins != -1)
  21. {
  22. break;
  23. }
  24. }
  25. //剩余钱amount 从c1,c2...ck-1凑也没有凑齐,那就是真凑不齐了。
  26. if (otherCoins == -1)
  27. {
  28. return -1;
  29. }
  30. return num + otherCoins;
  31. }

测试代码试一试

  1. int main(int argc, char *argv[])
  2. {
  3. vector<int> coins;
  4. coins.push_back(2);
  5. coins.push_back(3);
  6. coins.push_back(4);
  7. coins.push_back(5);
  8. int amount = 11;
  9. printf("\n%d:%d ",amount,countCoins(coins,amount));
  10. amount = 1;
  11. printf("\n%d:%d ",amount,countCoins(coins,amount));
  12. amount = 2857;
  13. printf("\n%d:%d ",amount,countCoins(coins,amount));
  14. printf("\n");
  15. return 0;
  16. }
  17. /*
  18. 运行结果:
  19. 11:3
  20. 1:-1
  21. 2857:572
  22. */

发表评论

表情:
评论列表 (有 0 条评论,91人围观)

还没有评论,来说两句吧...

相关阅读

    相关 【PTA】零钱

    题目重述 韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 104枚来

    相关 零钱问题

    题目:给你k种面值的硬币,面值分别为 c1, c2 … ck,每种硬币的数量无限,再给一个总金额 amount,问你amount 最少需要几枚硬币凑出这个金额,如果不可能凑出,

    相关 硬币问题

    / 给出k中面值的硬币,每种硬币的数量无限,再给一个总金额amount,问最少需要几枚硬币凑出这个金额,如果凑不出,返回-1 dp[i]定义:当目标金额为i时,至少

    相关 算式

    凑算式 (不知道为什么放不了图片.) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。 比如: 6+8/3+952/714 就是一种解法, 5

    相关 算式

    看这个算式: ☆☆☆ \+ ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字。 这个算式有多少种可能的正确填写方法? 173 +286 = 459 2

    相关 L3-001 零钱 深搜

    L3-001 凑零钱 (30 分) 韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩

    相关 动态规划 硬币问题

    凑硬币问题 假设有 1 元,3 元,5 元的硬币若干(无限),现在需要凑出 11 元,问如何组合才能使硬币的数量最少? 用数组d来存储当前每个面值可以对应的合成的最小