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

2023-10-29

题目描述

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

给定一个int n,请返回n分有几种表示法。保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。

测试样例:

6
返回:2

参考骑着炮弹进城提到的dp方法

这里补充一些解释,如有错漏,还请指正。

我们用dp[i](i属于1~n ) 表示组合成i元一共有几种方法。

 

首先所有的硬币组合问题都要有基础面值:1元。i的总组合方法一定等于i中最后coin元不用新面值的方法+最后coin元使用新面值的方法。

 

而最后coin元 使用新面值的方法必然等于i-coin的总组合方法。

不用新面值的方法就是旧值

 

假如只有1元,那对于任给的1~n,必然只有1中组合方法。

假设增加一种新面值:coin元。对于任意i(i属于1~n),

当i<coin的时候,新面值组合方法为0,dp[i]不变。

当i=coin,新组合方法为1,总dp[i]=旧dp[i]+1

当coin<i<2coin,新组合方法仍然为1,总dp[i]=旧dp[i] + 新dp[i-coin]

当i=2coin,仍然有总 dp[i]=旧dp[i] + 新dp[i- coin]

以coin=2为例

 

同样的道理,题目coin值取值为:[1 5 10 25],迭代处理即可

代码如下:

class Coins {
public:
    int countWays(int n) {
        // write code here
        int coins[4]={1,5,10,25};
        int dp[100001]={0};       
        dp[0]=1;
        for(int i=0;i<4;i++)
            for(int j=coins[i];j<=n;j++)
                dp[j] =(dp[j]+dp[j-coins[i]])%1000000007;     
        return dp[n];
    }
};

https://blog.csdn.net/cy13299138237/article/details/50474271

问题描述:

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

求解思路:

  这也是典型的动态规划问题,我们可以这样考虑:当只有1分的硬币时,n从1到n分别有多少种表示方法;当有1分和5分的硬币时,n从1到n分别有多少种表示方法,因此类推,直到我们将1分、5分、10分和25分的硬币全部使用完。思想类似于0-1背包问题,0-1背包问题的具体求解方法可以参考我的上一篇博客动态规划之0-1背包问题。我们用数组coins[i]={1,5,10,25}表示各种币值,此时可以维护一张二维表ways[i][j],其中横坐标表示前i种表示币值,j表示硬币的总值,则ways[i][j]表示能用前i种硬币来表示j分的方法数。

 当增加一种新的硬币币值时,有两种情况:

(1)不加入此种币值:ways[i][j]=ways[i-1][j];

(2)加入此种币值:加入该枚硬币之前的方法数为ways[i][j-coins[i]],那么加入该枚硬币之后构成j分的方法数也为ways[i][j-coins[i]]。

 因此当增加一种新的币值时,j分的表示方法数为ways[i][j]=ways[i-1][j]+ways[i][j-coins[i]]。

代码实现

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] coins = {1, 5, 10, 25};
        int[][] ways = new int[4][n + 1];
        for (int i = 0; i < 4; i++)
            ways[i][0] = 1; //第0行初始化为1
        for (int j = 1; j <= n; j++)
            ways[0][j] = 1; //第0列初始化为1
        for (int i = 1; i < 4; i++) {
            for (int j = 1; j <= n; j++) {
                if (j >= coins[i])
                    ways[i][j] = ways[i - 1][j] + ways[i][j - coins[i]];
                else
                    ways[i][j] = ways[i - 1][j];
            }
        }
        System.out.println(ways[3][n]);
    }
}

当然,维护二维表未免过于复杂,我们可以维护一张一维表,即用一维数组ways[j]来记录j分的表示方法数。改进的代码实现如下:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int []coins={1,5,10,25};
        int []ways=new int[n+1];
        ways[0]=1;
        for(int i=0;i<4;i++){
            for(int j=coins[i];j<=n;j++){
                ways[j]=ways[j]+ways[j-coins[i]];
            }
        }
        System.out.println(ways[n]);
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 基于Hadoop的Knn算法实现

    Knn算法的核心思想是如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别 则该样本也属于这个类别 并具有这个类别上样本的特性 该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别 Knn方法在类
  • Qt配置设置,修改全文字体大小颜色,背景颜色

    这是完成时的demo 选择所需 点击确认修改 全局修改 效果第二张图 在没有点击确认修改时 字体等按钮的改变只会在文本框里面体现出来 点击确认才会修改全局的东西 点击恢复默认时 字体字号颜色控件全部恢复初始状态 当点击确认修改 全局才会改为
  • python大文件的上传

    python大文件的上传 下载是同样的套路 下面是简单的代码 server端代码 import socket import json import struct buffer 1024 这里使用1024在上传视频的时候不容易出错 如果选择更
  • MATLAB智能优化算法 - 粒子群算法及MATLAB实例仿真

    一 粒子群算法理论 粒子群算法来源于鸟类集体活动的规律性 进而利用群体智能建立简化模型 它模拟的是鸟类的觅食行为 将求解问题的空间比作鸟类飞行的时间 每只鸟抽象成没有体积和质量的粒子 来表征一个问题的可行解 1 1 粒子群算法建模 粒子群算
  • 信号槽的概念与使用

    下面对Qt所设计的信号槽机制进行解析 部分摘自网络 信号 当对象改变其状态时 信号就由该对象发射 emit 出去 而且对象只负责发送信号 它不知道另一端是谁在接收这个信号 这样就做到了真正的信息封装 能确保对象被当作一个真正的软件组件来使用

随机推荐

  • python之实现ts转MP4

    import subprocess import os def convert ts to mp4 input path output path ffmpeg cmd f ffmpeg i input path c copy output
  • kconfig与Makefile运行机制

    前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式 模块和直接编译进内核 并介绍了模块的一种编译方式 在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢 在我们实际内核的移植配置过程中经常听说的内
  • 复旦微魔方FM33FR0xx——FL库笔记-GPIO

    一 引用文件 include fm33lg0xx fl gpio h 1 GPIO初始化定义 typedef struct uint32 t pin PIN uint32 t mode 功能模式 uint32 t outputType 输出
  • 常见路由协议分类及区别

    按路由生成方式分类 路由根据路由表生成方式可以分为 直连路由 静态路由 动态路由 1 直连路由 路由器接口所连接的子网的路由方式称为直连路由 2 静态路由 静态路由是由网络规划者根据网络拓扑 使用命令在路由器上配置的路由信息 这些静态路由信
  • MySQL~数据库的设计

    二 数据库的设计 1 多表之间的关系 1 1 三种分类 一对一 分析 一个人只有一个身份证 一个身份证只能对应一个人 如 人和身份证 一对多 如 部门和员工 分析 一个部门有多个员工 一个员工只对应一个部门 多对多 如 学生和课程 分析 一
  • 表格对角线两边打字_表格斜线一分为二怎么打字(excel斜杠分割表格打字)

    在整理表格的时候 相信许多朋友都会涉及到表格斜线的制作 比如单斜线和双斜线来区分不同维度项目 下面我们就来学习一下 如何通过Excel快速来添加我们的表格斜线 案例一 两步快速制作单表格单斜线 第一步 首先在单元格中依次输入文字 月份和姓名
  • 数据的异常值处理

    爬取职位并且对职位进行词频数据分析 老板直聘 修改爬取到的内容进行整理 刚开始的样子 其实比这个样子还要乱 而我要的数据的样子应该是整齐的 所以我把职位描述往后的内容做了replace替换 replace 职位描述 将职位描述往后的空格部分
  • 实现 Kafka 分区内消费者多线程顺序消费

    在1个topic中 有3个partition 那么如何保证数据的顺序消费 生产者在写的时候 可以指定一个 key 被分发到同一个 partition 中去 而且这个 partition 中的数据一定是有顺序的 消费者从 partition
  • 朝花夕拾:HSR/PRP冗余协议(一)

    引 言 本文将简要介绍HSR PRP协议本身的一些概念 和PRP协议的主要机制 并通过展示虹科与西班牙的合作伙伴SoC e RELYUM提供的HSR PRP相关解决方案 使各位读者能够具体了解HSR PRP的实际应用 近年来 列车 工控甚至
  • 运放芯片哪个最好_鱼和熊掌兼得——一台可以换芯片的PCM1794解码评测(上)...

    前不久给自己的自然声NS16搭配上一台价格合适量又足的LM3886功放 150瓦环牛加足够的散热片保证了每声道足量50瓦功率 运放采用OPA2604中高端运放 蓝牙方案用CSR8675 PCM5012这个目前最好声的蓝牙芯片 关键是价格合理
  • 异步 async/await深入探究

    异步 async await深入探究 async await题目 Generator函数与promise函数的区别 co 函数库 异步I O操作 异步与被委托 javaScript 是单线程运行机制 无论同步和异步最终还是单线程的 异步只是
  • 服务器设置temp文件夹权限设置,服务器windows temp 权限设置

    服务器windows temp 权限设置 内容精选 换一换 如果您需要对华为云上购买的云手机 Cloud Phone CPH 资源 给企业中的员工设置不同的访问权限 以达到不同员工之间的权限隔离 您可以使用统一身份认证服务 Identity
  • 分布式系统的自主服务

    分布式系统的自主服务 分布式系统作为server运行在机器上 需要很好的自动化运维来操作集群上的复杂的分布式系统 自动化运维要做到基础数据的完整收集 关键信息的准确推送 运维流程的正确 简便执行和确认 进程内部数据按需获取 对象运行状况的长
  • BPE, WordPiece, SentencePiece

    自己开发的NLP小项目 将BERT ALBERT和GPT2用Tensorflow2 0重写 欢迎围观 https github com kyzhouhzau NLPGNN 众号分享机器学习 深度学习知识和技巧 以及学习资料
  • tp5在数据库中获取随机数据

    private function random data num table where field order pk id countcus Db name table gt field pk gt where where gt sele
  • 四层、七层网络负载的区别?

    四层网络负载均衡是基于IP和端口做的转发 通过虚拟的IP和端口接收到请求后 然后分配到真实的服务器 K8s中的endpoint就是基于四层网络负载均衡实现 七层网络负载均衡是基于URL等应用层信息作的转发 通过虚拟的URL或者主机名接收到请
  • pytho资源下载问题,https://www.lfd.uci.edu/~gohlke/pythonlibs

    https www lfd uci edu gohlke pythonlibs 上面资源很多 经常会遇到错误的情况 比如我今天想安装opencv 然后点击网址 进到下面界面 我想下载红框中的资源 返回如下的Server Error界面 看到
  • Base64Util 工具类

    Base64Util 工具类 1 2 3 4 5 6 7 8
  • 电信机顶盒服务器信息,几个步骤 教会你用电信机顶盒网络设置教程!

    很多用户使用机顶盒安装第三方的时候不知道安装完了还要设置 今天 小编就为大家带来了电信itv机顶盒的网络设置教程 喜欢的朋友不要错过 小编自认为是非常有用的哟 连接步骤 1 连接线 插电源 开机 买回去第一次打开时肯定连接不上的 需要设置自
  • 【程序员面试金典】有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。

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