Recursion 硬币组合问题 @CareerCup

程序员面试金典(动态规划):1分,5分,10分,25分硬币面值组合问题(解题思路) 问题描述: 假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n。例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 + 1*5 + 2*20 + 1 * 50 + 1 * 100. 问总过有多少种可能的组合方式? [华为面试题] 1分2分5分的硬币三种,组合成1角,共有多少种组合? [创新 阅读详情

非常有意义的一道题,关键的一点要知道DFS是有顺序的,即在DFS中(5,1)和(1,5)是不一样的组合。所以对这道题我的第一种解法就重复算了多次,具体如图所示:当计算f(10)时,DFS给出的结果是9次,但实际上应该是4.

去重的方法是多用一个变量(level)来限制条件。这样能保证在访问对于给定level只会深搜小于等于level的分支。


同样参考了http://hawstein.com/posts/8.7.html

“但,这是错误的。问题出在哪?有序与无序的区别!这个函数计算出来的组合是有序的, 也就是它会认为1,5和5,1是不一样的,导致计算出的组合里有大量是重复的。 那要怎么避免这个问题?1,5和5,1虽然会被视为不一样,但如果它们是排好序的, 比如都按从大到小排序,那么就都是5,1了,这时就不会重复累计组合数量。 可是我们总不能求出答案来后再搞个排序吧,多费劲。这时我们就可以在递归上做个手脚, 让它在计算的过程中就按照从大到小的币值来组合。比如, 现在我拿了一个25分的硬币,那下一次可以取的币值就是25,10,5,1;如果我拿了一个 10分的,下一次可以取的币值就只有10,5,1了;这样一来,就能保证,同样的组合, 我只累计了一次”




package Recursion;

/**
 * Given an infinite number of quarters (25 cents), dimes (10 cents), nickels (5
 * cents) and pennies (1 cent), write code to calculate the number of ways of
 * representing n cents.
 * 
 * 译文:
 * 
 * 我们有25分,10分,5分和1分的硬币无限个。写一个函数计算组成n分的方式有几种?
 * 
 */
public class S9_8 {

	public static void main(String[] args) {
		System.out.println(recWrong(10));
		System.out.println(recCorrect(10, 10));
	}

	public static int recWrong(int n) {
		if (n < 0) {
			return 0;
		}
		if (n == 0) {
			return 1;
		}

		int ways = 0;

		ways += recWrong(n - 25);
		ways += recWrong(n - 10);
		ways += recWrong(n - 5);
		ways += recWrong(n - 1);
		return ways;
	}

	// 增加一个level变量来控制重复的问题!
	public static int recCorrect(int n, int level) {
		if (n < 0) {
			return 0;
		}
		if (n == 0) {
			return 1;
		}

		int ways = 0;

		if (level >= 25) {
			ways += recCorrect(n - 25, 25);
		}
		if (level >= 10) {
			ways += recCorrect(n - 10, 10);
		}
		if (level >= 5) {
			ways += recCorrect(n - 5, 5);
		}
		if (level >= 1) {
			ways += recCorrect(n - 1, 1);
		}
		return ways;
	}

}


实用工具抓取youtube热门数据 YouTube作为全球第二大搜索引擎,2024年日均视频播放量突破50亿次,头部创作者单月广告分成可达百万美元量级。但对数据分析者而言,其反爬机制堪称业界最严: ‌反爬技术升级‌:Google部署的Botguard系统可检测异常流量,触发机制包括: 单IP每小时请求超过50次即封禁 检测Headless浏览器指纹(如Chrome的navigator.webdriver属性) 动态加载内容(如评论数据需滚动页面3次后加载) ‌数据价值维度‌:某MCN机构研究显示,前100热门视频的标题关键词复用率高达67% 阅读详情

相关推荐

【深度学习】手把手教你在远程服务器上跑 YOLOv3 相关代码(含环境配置)

这篇文章主要记录了如何配置项目环境以及如何在远程服务器上跑 YOLOv3 模型。

作者正在煮茶中... 2383

【编程之法】硬币面值组合问题

这个问题我是转载的python27的,以下是原始博文链接。 【算法27】硬币面值组合问题 ——作者:python27

stormpang的博客 2234

Python+OpenCV实战:5分钟搞定机械臂手眼标定(眼在手上模式)

本文详细介绍了使用Python和OpenCV在5分钟内完成机械臂手眼标定(眼在手上模式)的实战教程。通过解析相机坐标系与机械臂基坐标系的转换关系,提供从数据采集到标定矩阵计算的全流程代码实现,帮助开发者快速解决AX=XB问题,提升机械臂视觉引导精度。

weixin_33670786的博客 497

给定数量的币值,如25分,10分,5分,1分,编写计算n分的有多少种表示方法

这是一个递归枚举问题。

点滴在心 1688

DAF-Net:动态注意力红外-可见光图像融合

DAF-Net 红外-可见光融合链路:IR/VIS 双分支 (Conv+ResBlock → 64ch) → DynamicAttentionFusion (Cat→Sigmoid→加权) → 重建 (Conv→Sigmoid)。TNO 上 SSIM=0.782 (vs IR), 0.734 (vs VIS), 参数量仅 218K。核心贡献:轻量动态注意力门控, 无监督 SSIM+MSE 损失不需要配准 ground truth。

FJN110的博客 318

《用 Python 爬取统计局年鉴:从 API 抓取到结构化分析,实战全流程详解》

在数据分析、经济研究、商业决策中,国家统计局发布的年鉴数据具有权威性和参考价值。本篇博客将带你从零实践:了解目标、设计爬虫、抓取年度数据、解析 JSON、保存结构化数据、并用 Pandas 简要分析可视化,且使用现代 Python 最佳实践(如httpx、pydantic、typer 等),提升代码质量与效率。如何抓取国家统计局年鉴数据;利用 API 方式高效获取;使用现代异步 Python 提升性能;将数据结构化输出;结合 CLI、类型校验和简单分析技术提升实用性。

2201_76125261的博客 1085

硬币表示(循环递归)

循环递归,每次选择若干个可以支配的硬币,然后交接给下个硬币重复

月巴虫丰博客 1427

第四节:Vben Admin登录对接后端getUserInfo接口

上一节,我们完成了/api/auth/login接口的创建,通过login接口,我们完成了登录和Token的生成。但是登陆还是报404返回,发现是Vben Admin又请求了一个/api/getUserInfo接口,本节我们就来分析完成这个接口本节,我们完成了getUserInfo接口,完成了登录操作,成功的进入到工作台页面。

cuiwin的专栏 2846

有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?

使用回溯法 int countQ = 0; int Target = 0; int coin[4] = {1,2,5,10}; int total=0; vector solution; void dfs(int index) { if(total == Target) { countQ++; cout<<countQ<<":"; for(int i=0; i<(int)so

tom555cat 7667

【AI测试干货】软件测试 - 全流程提示词完整体系

本篇教程是一套专为软件测试工程师打造的 AI 协作提示词体系。从测试计划制定、用例设计、自动化脚本开发、缺陷管理,到测试报告生成,每个环节都提供了结构化的提示词模板,帮助测试人员高效利用 AI 提升工作质量。

blues_C的博客 347

物联网竞赛单片机应用开发-项目汇总

物联网竞赛单片机应用开发-项目汇总

a6662580的博客 9003

动态规划之硬币组合问题

问题:如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元? 动态规划的本质是将原问题分解为同性质的若干相同子结构,在求解最优值的过程中将子结构的最优值记录到一个表中以避免有时会有大量的重复计算。 例如硬币组合问题,若求凑够11元的最少硬币数,可以先从凑够0元、1元、2元……的子结构开始分析。 假设d(i)为凑够i元所需最少硬币数,则 d(0) = 0   ...

weixin_34234721的博客 1270

【网络安全 | 渗透工具】密码字典生成工具crunch、cupp安装使用教程

Crunch是一个常用的密码破解工具,它可以根据指定的字符集、长度和模式生成各种可能的密码并进行暴力破解。同时,Crunch可以将生成的密码保存到文件中,以便在破解工具中使用。在进行渗透测试时,手动收集密码字典是十分耗时的,利用密码字典生成工具可以大幅缩短时间,提高爆破宽度。

等风来 8421

入门经典--硬币问题dp递归加递推

#include #include #include using namespace std; int v[101],s,n,mini[10001],maxn[10001],visi[10001]; int MAX(int a,int b) { return a>b?a:b; } int MINI(int a,int b) { return a<b?a:b; } int

qq_33312212的博客 1321

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

硬币面值组合的算法题解

方法一 转自http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html 动态规划的方法,是将m*n(m表示硬币的种类,n表示所要组成的和)的辅助数组, 个人认为这种方法的缺点是 较难理解,计算时间和辅助空间占用较多 方法二 参考http://blog.youkuaiyun.com/randyjiawenjie/article/det

styyzxjq2009的专栏 6779

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

基本动态规划之硬币问题

问题描述 假设有 1 元,3 元,5 元的硬币若干(无限),现在需要凑出 11 元,问如何组合才能使硬币的数量最少? 问题分析 乍看之下,我们简单的运用一下心算就能解出需要 2 个 5 元和 1 个 1 元的解。当然这里只是列出了这个问题比较简单的情况。当硬币的币制或者种类变化,并且需要凑出的总价值变大时,就很难靠简单的计算得出结论了。贪心算法可以在一定的程度上得出较优解,但不是每次都能得出最优...

weixin_33963594的博客 479

算法题 硬币组合问题

原文:http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html问题描述  假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n。例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 + 1*5 + 2*20 + 1 * 50 + 1 * 100....

hf : )的博客 8992

硬币组合问题-非递归实现

给定不同面额的硬币和一个总金额,计算出组成该总金额的所需硬币的最小个数。 好久没有刷算法题了,最近被问到这么个问题,有点懵逼,连个动态规划的状态转移方程都写不出来了。实在是惭愧。决定没事的时候,刷一些动态规划的东西。 网上有很多教程,直接写下状态转移方程: F(N) = Min{ F(N-k), k in coins } + 1, 其中coins是给定不同面额的硬币的集合。 递归实现比较简单,...

野懒人的专栏 490

币值为25分、10分、5分和1分的硬币,计算n分有几种表示方法

题目:《程序员面试金典(第5版)》P232

bupt8846的专栏 3025

【程序员面试金典】有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。

题目描述 有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。 给定一个int n,请返回n分有几种表示法。保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。 测试样例: 6 返回:2 参考骑着炮弹进城提到的dp方法 这里补充一些解释,如有错漏,还请指正。 我们用dp[i](i属于1~n ) 表示组合成i元一共有几种...

Twinkle 3313

动态规划之硬币面值组合问题

原文链接:http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html问题描述   假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n。例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 + 1*5 + 2*20 + 1 * 50 + 1 * 1

wickedvalley 1万+

动态规划之最少硬币凑钱问题

#include using namespace std; /** 题目描述:如果我们有面值为1元、3元和5元的硬币若干枚,最少要用多少枚硬币凑够n元? */ /** 解题分析: (1)要算n元要多少个凑完[f(n)],那我分类嘛: 1.首先拿一个1元的硬币,所以这个分类所需最少硬币数为f(n-1) + 1 2.首先拿一个3元的硬币,这个分类所需最少硬币数为f(n-3) + 1

2992

硬币组合

title: 硬币组合 date: 2018-4-5 10:12:40 categories: - algorithm tags: - algorithm 问题 给定一个数值sum,假设我们有m种不同类型的硬币{V1, V2, …, Vm},如果要组合成sum,求所有可能的组合数。 给定一个数值sum,假设我们有m种不同类型的硬币{V1, V2, …, ...

coderlong的博客 1759

给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有多少种表示法。

递归问题 int makeChange(int n, int denom) { int next_denom; switch(denom){ case 25: next_denom = 10; break; case 10: next_denom = 5;

auvKone 4021

Hard 单词变型成另一个单词 @CareerCup

对起始单词的每一个字母都做替换,把替换后的单词加入到queue中,并同时维护一个Map来记录变化前单词和变化后单词的联系。用来回溯时能打印出路径。 package Hard; import java.util.HashSet; import java.util.LinkedList; import java.util.Map; import java.util.Queue; impor

4761
上一篇: Recursion 图像软件中的“填充”函数 @CareerCup
下一篇: Recursion 八皇后问题 @CareerCup
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值