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

算法,各种,排列组合,计算,零钱,找零,方式,数量 · 浏览次数 : 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在各视觉任务上都有很不错的准确率,而且性能也很高 来源:晓飞的算法工程

跳跃表数据结构与算法分析

目前市面上充斥着大量关于跳跃表结构与Redis的源码解析,但是经过长期观察后发现大都只是在停留在代码的表面,而没有系统性地介绍跳跃表的由来以及各种常量的由来。作为一种概率数据结构,理解各种常量的由来可以更好地进行变化并应用到高性能功能开发中。本文没有重复地以对现有优秀实现进行代码分析,而是通过对跳跃表进行了系统性地介绍与形式化分析,并给出了在特定场景下的跳跃表扩展方式,方便读者更好地理解跳跃表数据