数据结构与算法-动态规划-换钱的方法数

换钱的方法数

【题目】
给定数组 arr,arr 中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值
的货币可以使用任意张,再给定一个整数 aim,代表要找的钱数,求换钱有多少种方法。

【举例】
arr=[5,10,25,1],aim=0。
组成 0 元的方法有 1 种,就是所有面值的货币都不用。所以返回 1。

arr=[5,10,25,1],aim=15。
组成 15 元的方法有 6 种,分别为 3 张 5 元、1 张 10 元+1 张 5 元、1 张 10 元+5 张 1 元、10
张 1 元+1 张 5 元、2 张 5 元+5 张 1 元和 15 张 1 元。所以返回 6。
arr=[3,5],aim=2。
任何方法都无法组成 2 元。所以返回 0。

代码:

public static int coins1(int[] arr, int aim) {if (arr == null || arr.length == 0 || aim < 0) {return 0;}System.out.println(onWay(arr, 0, aim));System.out.println(onWay2(arr, 0, aim, new int[arr.length + 1][aim + 1]));return onWay3(arr,aim);}/*** 暴力递归* @param arr* @param i 可变参数,位置下标* @param rest 可变参数,剩余金额* @return*/public static int onWay(int[] arr, int i,int rest ) {if(i== arr.length) {return rest==0?1:0;}int count = 0;for(int k =0;k*arr[i]<=rest;k++) {count += onWay(arr,i+1,rest-k*arr[i]);}return count;}/*** 记忆化搜索* @param arr* @param i 可变参数,位置下标* @param rest 可变参数,剩余金额* @return*/public static int onWay2(int[] arr, int i,int rest ,int[][] map) {if(i== arr.length) {return rest==0?1:0;}int count = 0;for(int k =0;k*arr[i]<=rest;k++) {if(map[i+1][rest-k*arr[i]] != 0) {count += map[i+1][rest-k*arr[i]] == -1?0:map[i+1][rest-k*arr[i]];} else {count += onWay2(arr,i+1,rest-k*arr[i],map);}}map[i][rest] = count==0?-1:count;return count;}/*** 动态规划* @param arr* @param i 可变参数,位置下标* @param aim 可变参数,剩余金额* @return*/public static int onWay3(int[] arr, int aim) {int[][] dp = new int[arr.length + 1][aim + 1];for(int i =0;i<=arr.length;i++) {dp[i][0] = 1;}for(int i =1;i*arr[0] <= aim;i++) {dp[0][i*arr[0]] = 1;}for (int i = 1; i < arr.length; i++) {for (int j = 1; j <= aim; j++) {int nums = 0;for(int k =0;j-k*arr[i] >= 0;k++) {nums += dp[i-1][j-k*arr[i]];}dp[i][j] =nums;}}return  dp[arr.length - 1][aim];}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阶段五:深度学习和人工智能(学习如何构建和训练神经网络模型)

构建和训练神经网络模型是深度学习的核心任务之一。Python 是一种常用的编程语言,因为它有许多强大的库和框架,例如 TensorFlow、PyTorch、Keras 等,这些库和框架可以帮助我们更轻松地构建和训练神经网络模型。 下面是一个简单的示例,演示如何使用 Keras 构建和训练一个简…

Keil新建STM32软件工程 - (详细步骤图文)

文章目录 1. 前言2. 下载芯片对应的Keil开发包3. 下载芯片对应的标准外设库 - STM32F10x_StdPeriph_Lib_Vx.x.x4. 新建工程文件夹 - Demo34.1 移植标准外设库4.2 启动文件介绍及如何选择 5. 新建软件工程 - Demo5.1 打开Keil → Project → New uVision Project5.2 选择芯片型号…

从头到尾的数据之旅

目录 引言 链表介绍 单向链表的接口实现 结构 创建节点 头插 尾插 头删 尾删 打印 节点查找 节点前插入 节点删除 内存释放 总结 引言 在前面的学习中&#xff0c;我们深入了解了顺序表&#xff0c;通过其增删查改的操作&#xff0c;我们发现了顺序表在某些情况…

OpenGL学习(二)绘制三维图形 固定管线

一.简单步骤 考虑顶点数据上色旋转 二.完整代码 myopenglwidget.h // An highlighted block #ifndef MYOPENGLWIDGET_H #define MYOPENGLWIDGET_H #include <QOpenGLWidget> #include <QOpenGLFunctions> #include <QOpenGLShaderProgram> #include <Q…

2023年福建省职业院校技能大赛中职组“网络安全”赛项规程含竞赛样题

2023年福建省职业院校技能大赛 中职组“网络安全”赛项规程 目录 一、赛项名称 二、竞赛目的 三、竞赛内容 四、竞赛方式 五、竞赛试题 六、竞赛规则 七、竞赛环境 八、技术规范 九、技术平台 十、成绩评定 十一、申诉与仲裁 十二、竞赛观摩 十三、竞赛视频 十…

如何批量给文件名加相同字段?

如何批量给文件名加相同字段&#xff1f;文件名批量修改是一项蕴藏了非常多知识的电脑操作技能&#xff0c;批量修改文件名称不仅仅是修改名称这么简单&#xff0c;有时候我们还可能需要批量王文件名称中添加一些相同的文字字段&#xff0c;批量操作注重的是高效率&#xff0c;…

docker 搭建 redis 主从节点

拉取 redis 镜像&#xff0c;比如拉取 redis v6.0.6 版本 docker pull redis:6.0.6docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE redis 6.0.6 7f7ce731b26f 4 weeks ago 158MB在你的工作目录下面创建 redis/write 和 redis/read 目…

Ubuntu(WSL)卸载与安装指定版本的 openssl

卸载 openssl 1&#xff09;查找并删除 openssl 关联的目录与文件 whereis opensslwhich opensslrm -rf /a/b/c/ // 使用 rm 命令删除所有 openssl 相关目录 2&#xff09;删除软件安装包 apt-get purge openssl 3&#xff09;删除配置文件 rm -rf /etc/ssl 安装 ope…

《Vue.js设计与实现》—Vue3响应系统的原理

一、响应式数据与副作用函数 1. 副作用函数 1-1 指令材料 在JavaScript中&#xff0c;副作用函数是指在执行过程中对外部环境产生可观察的变化或影响的函数。这种函数通常会修改全局变量、修改传入的参数、执行I/O操作&#xff08;如读写文件或发送网络请求&#xff09;、修…

论文阅读《Learning Adaptive Dense Event Stereo from the Image Domain》

论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/html/Cho_Learning_Adaptive_Dense_Event_Stereo_From_the_Image_Domain_CVPR_2023_paper.html 概述 事件相机在低光照条件下可以稳定工作&#xff0c;然而&#xff0c;基于事件相机的立体方法在域迁移时性…

【教程】开始使用ipaguard进行代码加固混淆

开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护&#xff0c;防止应用程序中的代码及资源文件被恶意篡改。Ipa Guard通过…

springMVC 学习总结(三) 拦截器及统一异常处理

一.拦截器 1.拦截器与过滤器的区别 拦截器 Interceptor 和 过滤器 Filter类似&#xff0c;主要用于拦截用户请求并作出一定处理操作&#xff0c; 但两则也有不同之处&#xff0c;如过滤器只在Servlet前后起作用&#xff0c;是Servlet规范定义的&#xff0c;是Servlt容器才支…

NGINX高性能服务器与关键概念解析

目录 1 NGINX简介2 NGINX的特性3 正向代理4 反向代理5 负载均衡6 动静分离7 高可用8 结语 1 NGINX简介 NGINX&#xff08;“engine x”&#xff09;在网络服务器和代理服务器领域备受推崇。作为一款高性能的 HTTP 和反向代理服务器&#xff0c;它以轻量级、高并发处理能力以及…

2-1基础算法-枚举/模拟

文章目录 1.枚举2.模拟 1.枚举 [例1] 特别数的和 评测系统 #include <iostream> using namespace std; bool pa(int x) {while (x) {if (x % 10 2 || x % 10 1 || x % 10 0 || x % 10 9) {return true;}else {x x / 10;}}return false; } int main() {int sum0;i…

【pytest】单元测试文件的写法

前言 可怜的宾馆&#xff0c;可怜得像被12月的冷雨淋湿的一条三只腿的黑狗。——《舞舞舞》 \;\\\;\\\; 目录 前言test_1或s_test格式非测试文件pytest.fixture()装饰器pytestselenium test_1或s_test格式 要么 test_前缀 在前&#xff0c;要么 _test后缀 在后&#xff01; …

Java 项目中引入jar包、Maven中打包第三方jar包

文章目录 前言方式一 项目中引入jar包步骤1 导入jar包步骤2 添加第三方jar包的引用步骤3 maven编译的时候能将第三方包编入方式二 Maven中打包第三方jar包步骤1 安装jar包到Maven仓库步骤2 项目中引入依赖前言 在Java项目中,我们经常需要引入第三方的jar包来扩展项目的功能。…

低压无功补偿在分布式光伏现场中的应用

摘要&#xff1a;分布式光伏电站由于建设时间短、技术成熟、收益明显而发展迅速&#xff0c;但光伏并网引起用户功率因数异常的问题也逐渐凸显。针对分布式光伏电站接入配电网后功率因数降低的问题&#xff0c;本文分析了低压无功补偿装置补偿失效的原因&#xff0c;并提出了一…

HTTP响应状态码有哪些?

提起http响应状态码&#xff0c;大家都不陌生&#xff0c;最常见的200&#xff0c;还有404&#xff0c;还有服务器异常500错误&#xff0c;具体http有哪些响应码&#xff0c;我们来具体看一下。 状态码是一个十进制的数字&#xff0c;RFC 标准把状态码分成了五类&#xff0c;用…

如何配置phpmyadmin,使它打开后自动登陆(不需要输入用户名和密码)

首先在根目录找到config.sample.inc.php复制一份文件名改为config.inc.php&#xff08;如果已经存在 config.inc.php 文件&#xff0c;则直接修改该文件即可&#xff09;。打开config.inc.php 找到 $cfg[Servers][$i][auth_type]&#xff0c;将 1 $cfg[Servers][$i][auth_type…

代码随想录算法训练营第46天| 139.单词拆分 多重背包

JAVA代码编写 139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 **注意&#xff1a;**不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s &…