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

算法,各种,排列组合,计算,零钱,找零,方式,数量 · 浏览次数 : 29

小编点评

```csharp public static int CountCombinations(int amount, int[] coins) { // 创建一个大小为 amount+1 的数组 dp,用于存储组合数量 int[] dp = new int[amount + 1]; // 初始化 dp[0] 为 1,表示金额为 0 时只有一种组合方式 dp[0] = 1; // 遍历硬币数组 foreach (int coin in coins) { // 遍历每个硬币,从硬币的面值开始遍历到目标金额 for (int i = coin; i <= amount; i++) { // 更新 dp[i],将之前的组合数量加上使用当前硬币 coin 后的组合数量 dp[i] += dp[i - coin]; } } // 返回目标金额 amount 对应的组合数量 return dp[amount]; } ``` **测试用例:** ```csharp [Test] public void CountCombinations_Example1_Returns3() { Assert.AreEqual(3, Kata.CountCombinations(4, new[] { 1, 2 })); } [Test] public void CountCombinations_Example2_Returns4() { Assert.AreEqual(4, Kata.CountCombinations(10, new[] { 5, 2, 3 })); } [Test] public void CountCombinations_Example3_Returns0() { Assert.AreEqual(0, Kata.CountCombinations(11, new[] { 5, 7 })); } [Test] public void CountCombinations_NoCoins_Returns1() { Assert.AreEqual(1, Kata.CountCombinations(0, new int[] { })); } [Test] public void CountCombinations_LargeAmount_ReturnsExpectedResult() { Assert.AreEqual(292, Kata.CountCombinations(100, new[] { 1, 2, 5, 10, 20, 50 })); } ```

正文

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

例如,如果你有面额为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。第五个测试用例测试一个较大的金额,验证返回值是否符合预期。*/

 

与【算法】在各种排列组合下,计算零钱找零方式数量相似的内容:

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

写一个函数,在给定一系列硬币面额的情况下,计算你可以用多少种不同的方式来兑换一笔钱。 例如,如果你有面额为1和2的硬币,有3种方法可以为4找零: 1+1+1+1,1+1+2,2+2。 硬币的顺序无关紧要: 1+1+2==2+1+1 此外,假设你有无限数量的硬币。 示例调用,一个金额和一系列独特面额的

java算法之排序算法大全

①排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优

算法金 | 再见!!!KNN

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 KNN算法的工作原理简单直观,易于理解和实现,这使得它在各种应用场景中备受青睐。 我们将深入探讨KNN算法,从基本概念到实现细节,从算法优化到实际应用,我们都会一一展开。通过本文,你将了

探索贪心算法:解决优化问题的高效策略

贪心算法是一种在每一步选择中都采取当前最佳选择的算法,以期在整体上达到最优解。它广泛应用于各种优化问题,如最短路径、最小生成树、活动选择等。本文将介绍贪心算法的基本概念、特点、应用场景及其局限性。 贪心算法的基本概念 贪心算法的核心思想是局部最优策略,即在每一步选择中都选择当前看起来最优的选项,希望

CeiT:商汤提出结合CNN优势的高效ViT模型 | 2021 arxiv

论文提出CeiT混合网络,结合了CNN在提取低维特征方面的局部性优势以及Transformer在建立长距离依赖关系方面的优势。CeiT在ImageNet和各种下游任务中达到了SOTA,收敛速度更快,而且不需要大量的预训练数据和额外的CNN蒸馏监督,值得借鉴 来源:晓飞的算法工程笔记 公众号 论文:

算法金 | 我最常用的两个数据可视化软件,强烈推荐

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 预警:今天文章的描述可能会让你有点别扭;如感到不适,请及时停止 在我行走江湖的行囊中,有两件利器,tableau与matplotlib,它们足以让我应对各种数据可视化的较

[DP] DP优化总结

写在前面 $ DP $,是每个信息学竞赛选手所必会的算法,而 $ DP $ 中状态的转移又显得尤为关键。本文主要从状态的设计和转移入手,利用各种方法对朴素 $ DP $ 的时间复杂度和空间复杂度进行优化与处理,以达到满足题目要求的目的; 参考文献: 动态规划算法的优化技巧 毛子青 c++ DP总结

Aho-Corasick 算法 AC自动机实现

敏感词过滤在社区发帖、网站检索、短信发送等场景下是很常见的需求,尤其是在高并发场景下如何实现敏感词过滤,都对过滤算法提出了更高的性能要求,Ahocorasick算法能够实现毫秒级的万字过滤匹配,能够很好的满足各种场景下的敏感词过滤需求。 Aho-Corasick算法通过将模式串预处理为确定有限状态自

【目标检测】R-CNN算法实现

R-CNN算法是目标检测领域的开山之作,为后续发展的各种目标检测算法指明了方向。本文将基于17Flowers数据集,在Pytorch框架下实现R-CNN目标检测功能。主要内容包括选择性搜索、目标特征提取及分类、边界框回归、模型训练、检测框预测等原理及代码实现。

Swin Transformer:最佳论文,准确率和性能双佳的视觉Transformer | ICCV 2021

论文提出了经典的Vision Transormer模型Swin Transformer,能够构建层级特征提高任务准确率,而且其计算复杂度经过各种加速设计,能够与输入图片大小成线性关系。从实验结果来看,Swin Transormer在各视觉任务上都有很不错的准确率,而且性能也很高 来源:晓飞的算法工程