第七章 递归、DFS、剪枝、回溯等问题 ------------- 7.4 硬币表示某个给定数值

第七章(上) 递归、DFS、剪枝、回溯问题 其实题目四个关键字就是一个递归的问题,解决:“有多少种方案这种问题”; 递归问题 1、递归改迭代:(递归可以改成迭代,递归是自上而下的倒着想,而迭代是自下而上的一步步更新变量,其实递归和迭代,迭代要更好一点,,因为他所占的空间要少,不需要递归那样用到栈的结构而开出一大片地方来)(但递归具有更强的表达力,用几句代码表达出很复杂的关系,改成迭代则需要写很多才可以)(递归问题分为数值型和非数值型) ... 阅读详情

一、题目:

  假设我们有8种不同面值的硬币{1,5,10,25},用这些硬币组合构成一个给定的数值n。 例如n=100,那么一种可能的组合方式为 100 = 2*25+5*5+2*10+5*1。 问总共有多少种可能的组合方式?

二、思路:

  先来看看递归解法,看到这种题目,不要一上来就想着我怎么来划分任务,我怎么把任务交给其他人去做。首先还是由简单到复杂,先列举一些简单的情况,发现规律。因为涉及到动态改变的问题,多种组合的方式,我们可以先在纸上写出几个简单的例子来进行分析,我们不妨写出1-25这个区间看一下n = 1-25之间的组合方案。

1---1
2---1
3---1
4---1
5---2
6---2
7---2
8---2
9---2
10---4
11---4
12---4
13---4
14---4
15---6 ...

  因为给出的n直接牵涉到能够使用较大的面值 比如n = 15 它就不能够使用25的面值,只能从10 5 1这三种面值来组合。比如n = 25 我们可以使用0个25的面值而剩下的由10 5 1来进行组合, 10 可以由使用10 5 1来组合, 5可以由 5 1来组合,比如n=100,我们可以使用0个25,剩下的100交给 10 5 1去凑,也可以使用1个25,那么剩下的75也交给10 5 1去凑,也可以使用2个25,3个25,这样基本就是递归的思路了。因为涉及到两个变量在变化,我们可以在循环中使用递归来解决,其中递归的方法需要解决传入的变量的问题:涉及到钱的数量和对应面值的变化所以需要传入两个变化的量到方法中。

  再来看看递推(迭代)解法,迭代解法主要就是下一步要做的事由上一步通过某种关系来决定。比如这里种类数主要由两个变量来决定,所以需要二维数组来存储,分别是1~n,以及能够使用的哪些面值。每一个点存储的是种数。而递推解法的思路本质上是和递归一样的,只是表达的方式不一样而已。

三、代码:

public class 硬币表示 {

    public static void main(String[] args) {
        int ways;
        for (int i = 1; i < 6; i++) {
            ways = countWays(i);
            System.out.println(i + "---" + ways);
        }
        System.out.println("========================================");
        for (int i = 1; i < 6; i++) {
            ways = countWay1(i);
            System.out.println(i + "---" + ways);
        }
        System.out.println("========================================");
        for (int i = 1; i < 6; i++) {
            ways = countWay2(i);
            System.out.println(i + "---" + ways);
        }
    }
    
    /**
     * 递推解法 
     */
    public static int countWay1(int n){
        int [] coins = {1,5,10,25};
        int [][] dp = new int[4][n+1];  // 前i种面值,组合出面值j
        for(int i = 0;i<4;i++){
            dp[i][0] = 1;         // 凑出面值0,只有一种可能,第一列初始化为1
        }
        for(int j=0;j<n+1;j++){
            dp[0][j] = 1;        // 用1来凑任何面值都只有一种解法,第一行初始化为1
        }
        for (int i = 1; i < 4; i++) {
            for (int j = 1; j < n+1; j++) {
                for (int k = 0; k <= j/coins[i]; k++) {
                    dp[i][j] += dp[i-1][j-k*coins[i]];
                }
            }
        }
        return dp[3][n];
    }
    
    /**
     * 递推解法
     */
    public static int countWay2(int n){
        int[] coins = { 1, 5, 10, 25 };
        int[] dp = new int[n + 1];
        dp[0] = 1;
        for (int i = 0; i < 4; i++) {
            for (int j = coins[i]; j < n+1; j++) {
                dp[j] = (dp[j]+dp[j-coins[i]]) % 1000000007;
            }
        }
        return dp[n];
    }
    
    /**
     * 递归形式
     */
    public static int countWays(int n){
        if (n<=0) {
            return 0;
        }
        return countWaysCore(n,new int[]{1,5,10,25},3);
    }

    private static int countWaysCore(int n, int[] coins, int cur) {
        if (cur==0) {
            return 1;
        }
        int res = 0;
        // 不选coins[cur]
        // 要一个
        // 要两个......
        // 循环递归  二分到多分支
        for (int i = 0; i * coins[cur] <= n; i++) {
            int shengyu = n - i * coins[cur];
            res += countWaysCore(shengyu, coins, cur - 1);
        }
        return res;
    }
}

四、结果:

 

Matlab编写的决策树及剪枝算法实现(数据集为Sogou_webpage) 利用Mtalab编写实现决策树生成ID3算法,利用Sogou_webpage数据集进行训练、验证与测试。之后实现剪枝。 立即下载

相关推荐

本地部署DeepSeek连接MATLAB:打造私有化AI编程助手全攻略

大型语言模型(LLM)通过理解自然语言生成代码、解释技术概念,其核心原理是基于海量数据训练的Transformer架构。这项技术为工程计算和数据分析带来了效率革命,尤其在代码生成、调试辅助和文档自动化等场景价值显著。开源模型如DeepSeek-coder凭借优秀的代码理解能力,结合Ollama提供的本地化部署方案,实现了完全离线、低延迟的私有化部署。通过配置国内镜像加速下载,并利用MATLAB内置的HTTP通信函数构造API请求,工程师可以在熟悉的MATLAB环境中直接调用本地模型,处理数据清洗、算法验证等

weixin_30239339的博客 518

六、第七章 &用硬币表示某个给定数值(笔记)

这里讨论的是有几种方式可以得到这个数值,先上代码和运行结果 import java.util.Scanner; public class A034_用硬币表示某个给定数值 { public static void main(String[] args) { int[] book = new int[] { 1, 5, 10, 25 }; Scanner sc = new Scann...

oQQSanGuo的博客 298

eda、gnm、anm究竟是个啥?

eda:主成分分析 gnm:高斯网络模型 anm:各向异性网络模型

药研猿的博客 1244

硬币表示某个给定值数《算法很美》

硬币表示某个给定值数 分为两次方式:递推和递归的形式。 /** * 假设我们有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. * 问总共有多少种可能的组合方式?(这道题目来自著名变成网站ProjectEuler)类似的题目还有: * * [华为面试题] 1分2分5分的硬币三种,组合成1角,共有多

罗彬桦的博客 303

vSphere环境证书更新/续订案例及注意事项

早期VMware的用户随后“十年之期”已到,陆陆续续出现各种登录问题,证书报错告警等,主要包含6.5到7.0的版本,VMware服务器虚拟化环境涉及的证书及类型较多,在实际更新中会出现各种奇怪的问题,有些坑耗费了大量的troubleshooting时间,极端情况下一天能看到十多遍如下报错😂本文整理了一个近期的更新案例,以及之前处理过的一些问题,仅作参考CA根证书颁发机构,用于签发其他组件的证书,其他证书的有效期不会超过根证书。

RaySun的技术Blog 3207

Nordic BLE芯片RF测试

BLE设备在过蓝牙BQB,FCC,ETSI等各种认证时实验室一般都需要做RF各项指标的测试。Nordic公司的SDK包中提供了两种RF测试程序,一种是DTM,另一种是Radio test。这两种都可以做RF指标测试但各自又有区别。DTM是按照蓝牙规范中Direct test mode所要求数据格式测试(数据格式定义参看:Bluetooth Core Specification v5.0->...

5639

硬币表示

题目描述 有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。 给定一个int n,请返回n分有几种表示法。保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。 测试样例: 6 返回:2 代码: class Coins { public: int countWays(int n)

Before1993的专栏 702

DDR5 的 PI: DIMM 上 PMIC,正在制造一批“新型 EMI 问题”

DDR5 的 PI,不再只是“供电设计”,而是一次“噪声管理设计”。电压稳定本地调节高频噪声EMI 风险系统不确定性DDR5 真正难的地方,不是跑起来,而是——在最差条件下,它还能不能一直跑。而 DIMM 上那颗 PMIC,正是你绕不开的关键角色。

weixin_43199439的博客 183

给定数量不限的硬币,币值为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

AgentScope Java 2.0 项目实战:从零构建企业级自主Coding Agent

本文基于 AgentScope Java 框架,完整拆解两个生产级 AI Agent 项目的从零开发全过程。其一是企业级自主编码机器人(agentscope-codingagent),支持 Issue→PR 自动实现、PR Code Review、Docker 沙箱隔离执行与多通道接入;其二是个人 AI 助手管理平台(agentscope-paw),采用 Spring Boot + React 全栈架构,支持多 Agent、技能市场与多 IM 通道。

program哲学 840

时间加强控制图,累计和控制图详细介绍,公式,计算 UCL,LCL,CL, sigma,C#实现

\(k\):参考值(通常取为检测偏移量的一半,例如 \(k = \frac{\delta \sigma}{2}\),\(\delta\)是希望检测的偏移量,\(\sigma\)是过程标准差)。- 示例中假设目标均值 \(\mu_0 = 10.0\),标准差 \(\sigma = 0.5\),参考值 \(k = 0.25\)(检测1σ偏移),控制限常数 \(h = 4\)。例如,若希望检测1个标准差的偏移(\(\delta = 1\)),则 \(k = 0.5\sigma\)。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 818

2020蓝桥杯备战-第七章- 数递归、DFS、剪枝、回溯-数值型递归

题目: 上楼梯 斐波那契数列 机器人走方格 硬币表示 1.上楼梯 题目描述: 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。 请实现一个方法,计算小孩有多少种上楼的方式。 为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n,请返回一个数,代表上楼的方式数。 保证n小于等于100000。 首先有两种方法: 递归 迭代 (1)递归 分析: 首先,...

weixin_43562415的博客 292

CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。

点云侠的博客 2153

深入递归:从递推公式到深度优先搜索(附 Java 代码)

在算法学习的征程中,递归是一个极为重要的概念。我们在第七章对递归进行了深入探讨,如今已临近尾声。这一章主要涵盖两个部分,下面为大家详细解析。

m0_57836225的博客 732

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

DFS 找硬币

问题 A: 找硬币 时间限制: 1 Sec 内存限制: 64 MB 提交: 144 解决: 43 [提交][状态] 题目描述 小蛇是金融部部长。最近她决定制造一系列新的货币。假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a)。例如 1,5,125,250就是一组合法的硬币序列,而1,5,100,125就不是。不知从哪一天开始,可爱的蛇爱上

蒟蒻QTY 514

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数独:深搜+剪枝 == 递归+回溯

题目描述 数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。 输入描述: 输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。 输出描述: 输出九行,每行九个空格隔开的数字,为解出的答案。 思路:深搜+剪枝 == 递归+回溯 凡是类似于迷宫的寻找路径的问题,均可由“递归+回溯”。

学无止境 2278

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

回溯、递归和剪枝

回溯、递归和剪枝 回溯法 一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。 用回溯算法解决问题的一般步骤: 1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)...

ChuckLin的博客 3198

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3, coins = [2] 输出: 0 解...

luxuiary的博客 4509

HDU 2566 统计硬币 (母函数或dfs)

统计硬币 Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8202Accepted Submission(s): 5606 Problem Description 假设一堆由1分、2分、5分组成的n个硬币总面值为m分,求一共有...

weixin_30681615的博客 121

递归法取硬币java_递归算法

递归算法​ 在函数或子过程的内部,直接或者间接地调用自己的算法。特点:(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。(4) 在 递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成 栈溢出等。所...

weixin_36488954的博客 577

算法 --- 动态规划(硬币问题)

算法描述 通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。 基本思想 若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接...

阿坤~的博客 1万+

POJ1753 翻硬币题解(DFS)

在POJ的first blood,一个dfs的解法,其中有很多巧妙的解法是值得学习的。但它头文件居然不能#include&lt;bits/stdc++.h&gt;,好气哦【题目】Flip GameTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 47846 Accepted: 20410DescriptionFlip game is...

zxwsbg的博客 1194

硬币的表示

1. 问题描述: 假设我们有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. 问总共有多少种可能的组合方式?(这道题目来自著名编程网站ProjectEuler) 2. ...

二哈 415

硬币表示(循环递归)

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

月巴虫丰博客 1428

求用几种钱币凑一个钱数的方法数,使用迭代

[code="java"] package test3; /** * 题目描述:使用 1元,5元,10元,20元,50元 这5中钱币凑成100元, * 共有多少种凑法? * 解题思路:依题意,即求方程 1a+5b+10c+20d+50e = 100 共有多少组解(a,b,c,d,e >= 0) * @author yj */ public class Mone...

Ancient_Noble的备忘录 540

#10-【DFS】硬币问题

Description 有1元、5元、10元、50元、100元、500元的硬币各c1、c5、c10、c50、c100、c500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?假定本题至少存在一种支付方案。 Input 一行c1、c5、c10、c50、c100、c500、A,中间用空格隔开。 Output 最少的硬币数量。 Sample Input 3 2 1 3 0 2 620 Sam...

2017gdgzoi999的博客 1920
上一篇: 第七章 递归、DFS、剪枝、回溯等问题 ------------- 7.3 题解:机器人走方格问题
下一篇: 后缀数组 - Suffix Array
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值