首页 > 编程语言 >【算法】在各种排列组合下,计算零钱找零方式数量

【算法】在各种排列组合下,计算零钱找零方式数量

时间:2023-07-15 09:44:22浏览次数:39  
标签:int 找零 零钱 测试用例 CountCombinations result new 排列组合 public

写一个函数,在给定一系列硬币面额的情况下,计算你可以用多少种不同的方式来兑换一笔钱。

例如,如果你有面额为1和2的硬币,有3种方法可以为4找零:

1+1+1+1,1+1+2,2+2。

硬币的顺序无关紧要:

1+1+2==2+1+1

此外,假设你有无限数量的硬币。

示例调用,一个金额和一系列独特面额的硬币:

CountCombinations(4, new[] {1,2}) // => 3

CountCombinations(10, new[] {5,2,3}) // => 4

CountCombinations(11, new[] {5,7}) // => 0


算法实现:

 1 using System;
 2 
 3 public static class Kata
 4 {
 5     public static int CountCombinations(int amount, int[] coins)
 6     {
 7         int[] dp = new int[amount + 1]; // 创建一个大小为 amount+1 的数组 dp,用于存储组合数量
 8         dp[0] = 1; // 初始化 dp[0] 为 1,表示金额为 0 时只有一种组合方式
 9 
10         foreach (int coin in coins) // 遍历硬币数组
11         {
12             for (int i = coin; i <= amount; i++) // 对于每个硬币,从硬币的面值开始遍历到目标金额
13             {
14                 dp[i] += dp[i - coin]; // 更新 dp[i],将之前的组合数量加上使用当前硬币 coin 后的组合数量
15             }
16         }
17 
18         return dp[amount]; // 返回目标金额 amount 对应的组合数量
19     }
20 }
21 /*这段代码使用动态规划来解决问题。它维护了一个名为 dp 的数组,其中 dp[i] 表示金额为 i 时的组合数量。代码通过遍历硬币数组,
22 并在每个硬币面值开始的位置到目标金额之间进行更新,以获得最终的组合数量。最后,返回目标金额 amount 对应的组合数量。*/

测试用例:

 1 using NUnit.Framework;
 2 
 3 [TestFixture]
 4 public class KataTests
 5 {
 6     [Test]
 7     public void CountCombinations_Example1_Returns3()
 8     {
 9         int result = Kata.CountCombinations(4, new[] { 1, 2 });
10         Assert.AreEqual(3, result);
11     }
12 
13     [Test]
14     public void CountCombinations_Example2_Returns4()
15     {
16         int result = Kata.CountCombinations(10, new[] { 5, 2, 3 });
17         Assert.AreEqual(4, result);
18     }
19 
20     [Test]
21     public void CountCombinations_Example3_Returns0()
22     {
23         int result = Kata.CountCombinations(11, new[] { 5, 7 });
24         Assert.AreEqual(0, result);
25     }
26 
27     [Test]
28     public void CountCombinations_NoCoins_Returns1()
29     {
30         int result = Kata.CountCombinations(0, new int[] { });
31         Assert.AreEqual(1, result);
32     }
33 
34     [Test]
35     public void CountCombinations_LargeAmount_ReturnsExpectedResult()
36     {
37         int result = Kata.CountCombinations(100, new[] { 1, 2, 5, 10, 20, 50 });
38         Assert.AreEqual(292, result);
39     }
40 }
41 /*
42 这里设计了5个测试用例来测试 `CountCombinations` 方法的功能和正确性。第一个测试用例是例子中给出的第一个示例,测试返回值是否等于 3。
43 第二个测试用例是例子中给出的第二个示例,测试返回值是否等于 4。第三个测试用例是例子中给出的第三个示例,测试返回值是否等于 0。
44 第四个测试用例测试当没有硬币时,返回值是否等于 1。第五个测试用例测试一个较大的金额,验证返回值是否符合预期。*/

 

标签:int,找零,零钱,测试用例,CountCombinations,result,new,排列组合,public
From: https://www.cnblogs.com/lan80/p/17555586.html

相关文章

  • 算法——排列组合
    排列、组合适合回溯法,保存当前状态什么时候使用used数组,什么时候使用begin变量有些朋友可能会疑惑什么时候使用used数组,什么时候使用begin变量。这里为大家简单总结一下:排列问题,讲究顺序(即[2,2,3]与[2,3,2]视为不同列表时),需要记录哪些数字已经使用过,此时用**u......
  • 7-010-(LeetCode- 518) 零钱兑换II
    1.题目读题518.零钱兑换II给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回0。假设每一种面额的硬币有无限个。题目数据保证结果符合32位带符号整数。......
  • 微信商家转账零钱优化版
    配置文件<?phpreturn['abc'=>["merchant_id"=>env('POINT_ABC_MERCHANTID'),"app_id"=>env('POINT_ABC_APP_ID'),"......
  • 排列组合
    排列组合目录排列组合排列数线排列圆排列:可重排列(其中一种)重集全排列:错位排列:组合数无重组合可重组合不相邻组合二项式定理恒等式(简化复杂度)常用:前言:第一次尝试边上课边记录笔记…可能思路会有一点小乱,排列数线排列公式:p(n,m)=!n/!(n-m)推论1:p(n,m)=n*p(n-1,m-1)推论2:p(......
  • 基础排列组合学习笔记
    排列组合是数学中一项非常重要、基础的内容,可以解决许多与计数有关的问题。让我们先从最基本的数数学起。前置知识加法原理假设你现在有\(a_0\)个物品,所有物品互不相同。你要从中拿一个物品出来,拿出的物品可能有几种?显然是\(a_0\)种,因为每一个物品互不相同,每一个物品都可......
  • js 实现排列组合
    组合:(不考虑顺序,无重复)//测试用例letdataArr=[1,2,3,4,5];functioncombination(dataArr,remainNum,currentArr){if(remainNum===0){console.log(...currentArr);return;}for(leti=0;i<dataArr.length+1-remainNum;i++){......
  • 算法题总结-找零钱
    原题给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。如果无解,请返回-1.数据范围:数组大小满足0\len\le100000≤n≤10000,数组中每个数字都满足0<val\le10000......
  • 322.零钱兑换
    其中,dp[i][j]表示使用前i个硬币可以凑出总价值为j的钱数的最小硬币数,初始化时将dp[0][i]的值设为无穷大,因为凑出总价值为0的钱数不需要任何硬币。在状态转移方程中,如果j<coins[i-1],则不能选当前硬币,此时dp[i][j]=dp[i-1][j];否则,可以选当前硬币,dp[i][j]=dp[i][j-coins......
  • 动态规划(一)硬币找零,机器人路径
    动态规划(DynamicProgramming,简称DP),虽然抽象后进行求解的思路并不复杂,但具体的形式千差万别,找出问题的子结构以及通过子结构重新构造最优解的过程很难统一,并不像回溯法具有解决绝大多数问题的银弹。动态规划求解的一般思路1.硬币找零扩展1:单路取苹果扩展2:机器人路径2.字符......
  • 322. 零钱兑换
    给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。输入:coins=[1,2,5],amount=11输出:3解释:11=5+......