博客
关于我
拼凑纸币、大整数问题
阅读量:681 次
发布时间:2019-03-17

本文共 2650 字,大约阅读时间需要 8 分钟。

动态规划计算纸币组合数

背景介绍

在金融领域,动态规划是一种常用的算法,可以用来解决富缴问题。问题的核心是,给定多种面额的纸币,计算组成特定金额N元所需不同组合的总数。每一种纸币的面额可以使用零次或一次或多次,这与经典的"硬币问题"类似。

方法思路

  • 动态规划基本思想:我们会采用动态规划的方法,将问题分解为更小的子问题,逐步解决这些子问题,最终达到目标。

  • 数组定义:创建一个长度为N+1的数组b,用于存储组成金额j元的不同组合数。其中,b[j]表示组成j元的组合数。

  • 初始化数组:初始状态下,只有金额为0元时有一种组合方式(使用0张纸币),因此b[0] = 1。

  • 更新数组:遍历每一种面额,如果当前面额小于等于目标金额,那么可以组成金额j元的组合数等于之前可以组成金额j元的组合数加上可以组成金额j减去当前面额的组合数。

  • 实现细节:每一轮循环都通过外层循环遍历所有面额,内层循环遍历所有金额,从1到N,逐步填充数组b。

  • 代码实现

    public class Money {    public static void main(String[] args) {        int[] a = {1, 5, 10, 20, 50, 100};        Scanner in = new Scanner(System.in);        int m = in.nextInt();        games(a, m);    }    private static void games(int[] a, int m) {        // 使用动态规划解决问题        long[] b = new long[m + 1];        b[0] = 1;        for (int i = 0; i < 6; i++) {            for (int j = 1; j <= m; j++) {                if (j >= a[i]) {                    b[j] += b[j - a[i]];                }            }        }        System.out.println(b[m]);    }}

    代码解释

    • 数组定义和初始化:创建数组b,其中b[0]初始化为1,表示组成0元的唯一组合方式(使用零张纸币)。
    • 外层循环遍历面额:外层循环遍历每一种纸币的面额。
    • 内层循环更新金额:内层循环遍历从1到N的所有可能金额,对于每一种金额j,检查当前面额是否小于等于j,如果是,则更新b[j]的值。
    • 结果输出:最终输出数组b[m],即组成金额m元的不同组合数。

    优化与过渡

    该方法采用了动态规划算法,其时间复杂度为O(n),其中n为纸币面额的数量。因为我们只遍历了一次纸币面额和金额范围,所以算法具有较好的性能,适用于较大的N值(如0-10000)。


    大整数运算实现

    背景介绍

    在某些实际场景中,常常需要处理非常大的整数,这对传统的整数类型提出了很高的要求。对于 Java 开发者而言,BigInteger 类提供了一种强大的解决方案,可以处理任意大小的整数,支持高精度计算。

    方法思路

  • 输入处理:从标准输入中读取两个字符串,表示两个整数。

  • 错误校验:检查输入字符串是否有效。有效条件包括:- 每个字符都是数字;- 最前面不能是零(除非是单独的"0")。

  • 转换为大整数:使用 BigInteger 类将字符串转换为大整数对象。

  • 验证结果:在转换过程中,捕获异常,如非法字符、数值溢出等,并输出错误信息。

  • 执行加法:对两个有效的大整数进行相加,输出结果。

  • 代码实现

    import java.math.BigInteger;import java.util.Scanner;public class BigNum {    public static void main(String[] args) {        // 读取输入        Scanner scanner = new Scanner(System.in);        scannedStrings = scanner.nextLine();        String firstStr = scannedStrings.split(" ")[0];        String secondStr = scannedStrings.split(" ")[1];        try {            // 转换为BigInteger            BigInteger num1 = BigInteger.valueOf(firstStr);            BigInteger num2 = BigInteger.valueOf(secondStr);            // 定义运算            BigInteger result = num1.add(num2);            // 输出结果            System.out.println("[" + firstStr + "] + [" + secondStr + "] = " + result.toString());        } catch (Exception e) {            System.out.println("Error: " + e.getMessage());        }    }    // 接收输入字符串    String scannedStrings;}

    代码解释

    • 输入处理:使用 Scanner 从标准输入读取一行数据,并按空格分割成两个部分。
    • 错误校验:在转换过程中,BigInteger.valueOf 会自动抛出 NumberFormatException 异常,如果输入包含非数字字符,则会被捕获并打印错误信息。
    • 转换与运算:使用 BigInteger 类进行加法运算,无需担心数值大小的问题。
    • 输出结果:将结果转换为字符串后,与输入值一同打印,方便用户验证。

    总结

    以上代码实现了两个常见问题的解决方法:动态规划计算纸币组合数和大整数运算。通过详细的代码注释和解释,可以清晰地理解每个部分的实现逻辑。

    转载地址:http://pvyhz.baihongyu.com/

    你可能感兴趣的文章
    nmap指纹识别要点以及又快又准之方法
    查看>>
    Nmap渗透测试指南之指纹识别与探测、伺机而动
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NMF(非负矩阵分解)
    查看>>
    nmon_x86_64_centos7工具如何使用
    查看>>
    NN&DL4.1 Deep L-layer neural network简介
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.7 Parameters vs Hyperparameters
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    nnU-Net 终极指南
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    NO 157 去掉禅道访问地址中的zentao
    查看>>
    no available service ‘default‘ found, please make sure registry config corre seata
    查看>>
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    查看>>
    no connection could be made because the target machine actively refused it.问题解决
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>