Java动态规划硬币问题最优值和最优解

2023-11-07

给定不同面额的硬币coins和一个总金额amount。计算并输出可以凑成总金额所需的最少的硬币个数和使用的硬币。

网上介绍动态规划的文章已经很多了, 我的这篇文章分析了我自己分析硬币问题的算法在二维数组的效能分析,其中用了Intellij IDEA的工具。

代码 

public class DynamicProgramming {
    public static void main(String[] args) {
      
        int[] coins = {2,5};
        int capacity = 21;
        CoinValue CV = new CoinValue();
        CV.Coinvalue(coins,capacity);
        
    }
}
//币值问题
class CoinValue {
    public void Coinvalue(int[] coins, int capacity) {
        //规划数组
        int[][] map = new int[coins.length + 1][capacity + 1];
        //初始化 第一行列为0
        for (int i = 0; i < coins.length + 1; i++) {
            map[i][0] = 0;
        }
        for (int i = 0; i < capacity + 1; i++) {
            map[0][i] = 0;
        }
        //填数组,
        /*
         * 容量小于当前币 填写上一种币的当前容量的位置存储值
         * 容量等于当前币 填写1
         * 容量大于当前币
         * */
        for (int i = 1; i < coins.length + 1; i++) {
            for (int j = 1; j < capacity + 1; j++) {
                if (coins[i - 1] == j) {
                    map[i][j] = 1;
                } else if (coins[i - 1] > j) {
                    map[i][j] = map[i - 1][j];
                }
                //容量大于当前币
                else {
                    //判断减去该币面额后的容量在该币的位置的值是否为0
                    if (map[i][j - coins[i - 1]] == 0) {
                        //判断减去该币面额后的容量在该币的位置的上一位置的值是否为0,
                        if (map[i - 1][j - coins[i - 1]] == 0) {
                            map[i][j] = 0;
                        //不为0则当前值填写减去该币面额后的容量在该币的位置的上一位置的值
                        } else {
                            map[i][j] = map[i - 1][j - coins[i - 1]] + 1;
                        }
                    }//减去该币面额后的容量在该币的位置的值 + 1
                    else {
                        map[i][j] = 1 + map[i][j - coins[i - 1]];
                    }
                }
            }
        }

        //得到需要最少硬币数,及其在数组的横坐标
        int x = 0;
        for (int i = coins.length; i > 0; i--) {
            if (map[i][capacity] != 0) {
                System.out.println("min :" + map[i][capacity]);
                x = i;
                break;
            }
        }
        //判断是否无解
        if (x == 0) {
            System.out.println("no permutation");
        }
        /* 查看x以及map
        System.out.println(x);
        for (int i = 0; i < coins.length + 1; i++) {
            for (int j = 0; j < capacity + 1; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println("");
        }
        */
        //存储使用硬币数时使用的硬币
        ArrayList<Integer> coin = new ArrayList<>();

        //从最少数位置往回找使用过的硬币(一定有解)
        //存储x更新至最小面额硬币前的当前币种
        int temp = 0;
        //容量 <= 0时停止循环
        while (capacity > 0 && x > 0) {
            //容量小于x,说明当币面额,此时是继承上一币种的值,减小直至合理
            while (capacity < coins[x - 1]) {
                x--;
                //说明前一次capacity尽管大于当前币种面值,但是减去该面值后,剩余capacity小于最小面值
                if (x <= 0) {
                    //将x回到更新至最小面额硬币前的当前币种的下一币种
                    x = temp - 1;
                    //将capacity回退到更新至最小面额硬币前的当前币种时的capacity
                    capacity = capacity + coins[temp - 1];
                    //将最优解末尾回退
                    coin.remove(coin.size() - 1);
                    break;
                }
            }
            temp = x;
            //更新容量,此时容量只能大于等于币的面额
            capacity = capacity - coins[x - 1];
            coin.add(coins[x - 1]);
        }
        //输出硬币
        for (int i = 0; i < coin.size(); i++) {
            System.out.print(coin.get(i) + " ");
        }
    }
}

结果

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

Java动态规划硬币问题最优值和最优解 的相关文章

  • Java-线程与CPU的关系

    我对多线程还很陌生 我正在开发一个项目 尝试在我的 Java 程序中使用 4 个 CPU 我想做类似的事情 int numProcessors Runtime getRuntime availableProcessors ExecutorS
  • 透明平开窗

    我有一点JWindow上面有一个标志 用户可以将东西拖到上面 我主要在 OS X 上开发我的应用程序 为了获得我使用的透明窗口 setBackground new Color 0 0 0 0 在 Mac 上 这工作得很好 但在 Window
  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • 将 spring-security 与 spring-webflux 结合使用时禁用 WebSession 创建

    我正在使用 Rest api 运行无状态 spring boot 应用程序 并希望按照所述禁用 WebSessions 的创建https www baeldung com spring security session https www
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 使用 Spring Data REST 处理自定义异常 (i18n)

    我正在使用 Spring Boot 1 5 4 和 Spring JPA Spring Data REST HATEOAS 我正在寻找一种最佳实践 Spring 方式 来自定义异常 Spring Data REST 正在管理添加 i18n
  • RSA SignatureException:签名长度不正确

    我在签署 rsa 签名时遇到问题 我有一个用私钥加密的签名 然而 当我尝试使用公钥验证它时遇到问题 我得到以下异常 java security SignatureException Signature length not correct
  • 初级 Java 计数器代码

    我的教授希望我这样做 使用下面的 Counter 接口写入多个可互换计数器 public interface Counter Current value of this counter int value Increment this co
  • 正确使用 JDBC 连接池 (Glassfish)

    我需要在 Java Web 服务中作为会话 bean 实现数据库连接 但我不确定我这样做是否正确 我创建了一个类 public final class SQLUtils private static DataSource m ds null
  • 用 java 编写解释器时的 switch 或 if 语句

    当前的作业需要我编写一个程序 以一种非常微小且基本的编程语言 行为有点像 FORTRAN 来读取包含指令的文件并执行这些指令 基本上它是我猜的语言的简单解释器 它是完全线性的 所有语句都是按顺序定义的 并且只有字符串和整数变量 我需要查找和
  • 如何将自定义日志处理程序添加到 Google App Engine?

    我正在尝试向我的 java 应用程序添加自定义日志处理程序 我已经实现了一个扩展 java util Logging Handler 类的 InnerLogger 类 在我的logging properties中声明为处理程序 handle
  • 以编程方式设置 Logback Appender 路径

    我正在尝试以编程方式设置 Logback 附加程序路径 滚动文件附加器 http logback qos ch apidocs ch qos logback core rolling RollingFileAppender html准确地说
  • Java:使用 Java.util.concurrent 线程访问读取线程串行端口

    我正在尝试编写一个 Java 串行设备驱动程序并想使用 对我来说是新的 java util concurrent包裹 我有一种发送数据包然后等待 ACK 的方法 我打算有炭 接收在不同的线程中运行 如果接收线程收到 ACK 它应该使用发送数
  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • 在Java中多次读取System.in会导致IOException?

    我正在尝试创建一个小命令行游戏来强化我在过去几个月中在 Java 中学到的一些东西 我正在尝试创建一个名为 readInput 的方法 它返回一个我可以一次又一次调用的字符串 第一次它工作正常 但第二次它会导致 IO Exception 如
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 战争库中的罐子爆炸

    我们可以将分解的 jar 文件放入 war web inf 库中吗 它在 JBOSS 4 2 中对我不起作用 我收到以下错误并且无法部署应用程序 Caused by javax management RuntimeOperationsExc
  • 无法映射 ftl 文件中的 jsonRequest 属性

    我想在 FTL 文件中映射下面的 json 文件市场和子市场字段 但是当我尝试下面的代码时 它没有映射 有人可以帮助我吗 我从 2 天开始就无法映射它 Json请求 ProcessOrderRequest prevalidationMode
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我

随机推荐

  • 【设计】OOA、OOD、OOP

    这三者都是 OO Object Oriented 领域的思想 一般我们我们接到产品经理的需求后 开发阶段分这样几个步骤 可行性预研阶段 此阶段评估需求是否合理 能否实现 OOA阶段 此阶段分析用例 定义领域模型 OOD阶段 此阶段定义类图
  • Chat 插件上线,免注册即可使用~

    OpenAI 新上线的 Chat 可谓是火爆出圈 这个语言对话模型可以回答问题 承认错误 挑战不正确的前提 还能帮你修改代码中的 bug Chat 的应用场景很广泛 它可以用于处理多种类型的对话 包括对话机器人 问答机器人和客服机器人等 它
  • 几种常用时钟分频实现方法

    在我们学习中 常常需要对时钟进行分频处理 本文将介绍几种常用分频方法 一 2的整数次幂分频 这种分频很简单 只需要设置一个计数器 对计数器进行计数 计数器的第i位则对应的2的i 1次幂分频 此方法适用于占空比为1 2 如果占空比不为1 2
  • CentOS7安装Docker详细步骤

    查看此文章前强烈建议先看这篇文章 Java江湖路 专栏目录 前言 记录在CentOS7中安装docker的每一个步骤 1 Docker介绍 什么是docker 虚拟化容器技术 Docker基于镜像 可以秒级的启动各种容器 每一种容器都是一个
  • 使用cloudflare-pages托管网站

    欢迎关注 攻城狮Gala 公 众 号 每天一起学习 努力成为Web3全栈 如何白嫖省心的CloudFlare Pages服务 完美替代Github Pages 对大陆网络友好 背景 之前自己重新开始写博客了 为了方便本地md笔记 参考个人笔
  • [Orangepi 3 LTS]学习记录(一)

    本章内容基于官方手册 OrangePi 3 LTS H6 用户手册 v2 4 与自己实际操作撰写 准备香橙派开发板 闪迪TF卡 性能会更好一些 TF读卡器 USB转TTL模块 串口调试 HDMI 桌面登录 一 镜像安装 1 版本选择 下载对
  • WAF防火墙

    添加依赖 一下看情况而添加 不确定需不需要 apt get install gcc libpcre3 libpcre3 dev zlib1g dev tengine依赖 sudo apt get install openssl libssl
  • Nginx里的root/index/alias/proxy_pass的意思

    1 alias 别名配置 用于访问文件系统 在匹配到location配置的URL路径后 指向 alias 配置的路径 如 注意alias配置最后一定要有 而root可以没有 location test alias home sftp img
  • LEFT JOIN 和JOIN 多表连接

    转载 https blog csdn net mccand1234 article details 51734713 四张表contract customer customer3 customer4 这是比较熟悉的3张表的连接 SELECT
  • three.js全景视频

    小生最近学习three js 将three js官网提供的网站实例翻译翻译 共同学习 接下来翻译一下 webgl video panorama equirectangular html 运行结果https threejs org examp
  • Nacos实战(19)-Nacos健康检查机制:保障你的服务稳定运行!

    0 前言 注册中心不应仅提供服务注册和发现功能 还应保证对服务可用性监测 对不健康的服务和过期的进行标识或剔除 维护实例的生命周期 以保证客户端尽可能的查询到可用的服务列表 因此本文介绍Nacos注册中心的健康检查机制 1 注册中心的健康检
  • 在线代码编译运行工具

    在线代码编译运行工具 如果需要学习语言 比如练习一些算法 或者跑一些别人写的代码 有一些语言特性不太了解需要写一些简单的 demo 做一些验证 那么先搭建一个环境去跑就有一点麻烦了 无需搭建本地环境的代码在线运行工具就可以派上用场了 在线代
  • Mybatis 中$与#的区别

    1 是将传入的值当做字符串的形式 eg select id name age from student where id id 当前端把id值1 传入到后台的时候 就相当于 select id name age from student w
  • Linux环境里实现FLink项目的Zookeeper与Kafka启动

    1 配置FLink遇到的坑 启动 start cluster sh后提示Permission denied 用sudo会提示Please specify JAVA HOME Either in Flink config conf flink
  • C#串口SerialPort常用属性方法

    SerialPort 属性 BaudRate 获取或设置波特率 BytesToRead 得到 接收到数据的字节数 BytesToWrites 得到送往串口的字节数 DataBits 获取或设置数据位 IsOpen 获取一个值 判断串口是否打
  • SpringBoot结合Redis将Token存入缓存中进行登录

    将登录的Token存储在Redis中可以带来以下好处 提高安全性 将Token存储在Redis中 比将Token保存在本地Cookie或浏览器存储中更加安全 因为攻击者无法访问您的服务器上存储的Token 此外 由于Redis支持设置过期时
  • selenium 使用及定位

    使用find element by 方法只需导入 from selenium import webdriver 使用 find element 方法除了导入 from selenium import webdriver 还要导入 from
  • Java OpenJDK 8u382 Windows x64 Installer

    文章目录 一 Azul 二 Adopt 三 IBM 四 Oracle 一 Azul WEB Page Download Azul Zulu Builds of OpenJDK Windows installer Azul Zulu Buil
  • 干电池升压5V,功耗比较低

    干电池升压5V 功耗10uA PW5100干电池升压5V芯片 输出电容 所以为了减小输出的纹波 需要比较大的输出电容值 但是输出电容过大 就会使得系统的 反应时间过慢 成本也会增加 所以建议使用一个 22uF 的电容 或者两个 22uF 的
  • Java动态规划硬币问题最优值和最优解

    给定不同面额的硬币coins和一个总金额amount 计算并输出可以凑成总金额所需的最少的硬币个数和使用的硬币 网上介绍动态规划的文章已经很多了 我的这篇文章分析了我自己分析硬币问题的算法在二维数组的效能分析 其中用了Intellij ID