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;
	}

}


Avalonia使用CefNet 实现web-browsers(基于CentOS8 Arm64架构) 阅读详情

相关推荐

DeepSeek API调用太复杂?OneAPI一站式聚合解决方案

本文介绍了OneAPI如何作为一站式聚合解决方案,简化DeepSeek API的调用流程。通过统一接口、智能路由和模型映射等核心功能,OneAPI大幅降低了多API适配的复杂性,提升开发效率。文章还提供了详细的部署指南和高阶使用技巧,帮助开发者快速实现API聚合管理。

weixin_27215337的博客 381

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

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

stormpang的博客 2234

解决AutoDock与Python版本冲突导致的内存泄漏问题:从BHtree *错误到环境配置优化

本文深入解析了AutoDock分子对接中常见的‘BHtree *’内存泄漏错误,其根源在于SWIG接口模块与Python运行环境的版本不匹配。文章提供了根治方案:通过构建Python 2.5.4与MGLTools 1.5.6的黄金兼容组合,并详细指导环境清理、安装配置及实战测试,从而彻底解决该内存泄漏问题,确保AutoDock工作流的稳定运行。

g5h6i的博客 1113

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

这是一个递归枚举问题。

点滴在心 1688

星载SAR系统参数设计过程自动化方法研究

 本文提出了一种 SAR系统参数自动化设计的 方法。首先,针对部分参数仍需手工选取的现状 建立了最优化求解模型,并给出了 PRF 和波位位 置的优化选取结果,使参数设计流程更加高效便 捷。然后,针对 SAR 系统参数设计过程中部分技 术指标的评测结果不满足用户需求时无法自动调 节的现状,采用 PID 控制器对方位向天线尺寸、信 号带宽、PRF 等参数进行自动调节,使得方位分辨 率、距离分辨率、方位模糊比等技术指标向用户需 求值逐步靠近。通过仿真实验验证了该方法的可 行性,实现了SAR系统参数设计过程的自动化

qq_43416206的博客 1523

【MATLAB+VScode】VScode调试MATLAB代码的终极指南

本文详细介绍了在VScode中调试MATLAB代码的完整方案。通过配置MATLAB Engine for Python作为桥梁,实现在VScode中设置断点、单步执行、查看变量等交互式调试功能,有效结合了VScode的现代化编辑体验与MATLAB的强大计算内核,显著提升开发效率。

weixin_29161719的博客 412

硬币表示(循环递归)

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

月巴虫丰博客 1427

操作系统头歌 课后作业3.3.2:进程的调度

请问:从 6 号进程刚创建完 7 号进程开始,在接下来的 9 次进程调度中,每次调度时,6 号和 7 号进程的剩余时间片是多少?请问:从 6 号进程刚创建完 7 号进程开始,在接下来的 9 次进程调度中,每次调度时,6 号和 7 号进程的剩余时间片是多少?根据相关知识回答当程序 01.c 运行时(在版本 0 内核中),会在父子两个进程(假设分别为 6 号和 7 号进程)中分别输出字符串。当程序 01.c 运行时(在版本 0 内核中),会在父子两个进程(假设分别为 6 号和 7 号进程)中分别输出字符串。

weixin_73255571的博客 4705

有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

几率大的网络安全面试题(含答案)

其他篇章:Java校招极大几率出的面试题(含答案)----汇总 本文面试题汇总: 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理 rip协议是什么?rip的工作原理 什么是RARP?工作原理 OSPF协议?OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手? tcp为什么要三次握手? dns是什么?dns的工作原理 一次完整的HTTP请求过程 Cookies和ses...

睶 6万+

C/C++小宇宙代码(完整代码)

C语言实现小宇宙的完整代码。

AIGC 2523

动态规划之硬币组合问题

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

weixin_34234721的博客 1270

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏5(附项目源码,完结)

本期是本项目的最后一篇,主要内容是配置环境、生成不同敌人、结束重开。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2572

入门经典--硬币问题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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

硬币面值组合的算法题解

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

styyzxjq2009的专栏 6779

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

基本动态规划之硬币问题

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

weixin_33963594的博客 479

温度PID控制PLC程序

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

算法题 硬币组合问题

原文: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、付费专栏及课程。

余额充值