每日一题之动归-换钱的最少次数(二)
题目:上一道题是给定一个钱的数组,可以使用任意张数。接下来改变一下题目:给定数组arr,arr中所有的值都是正数。每个值仅代表一张钱的面值,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。
例子:
arr=[5,2,3],aim=20。
这里5+2+3=10最大才是10,所以不能组成,返回-1。
arr=[5,2,5,3],aim=10。
这里有两种可能一种是5+5 ,还有一种是5+2+3,我们选择两次的,返回2。
arr=[5,2,5,3 ],aim=15。
这里返回4。
arr=[5,2,5,3],aim=0。
不用任何货币就可以组成0元,返回0。
分析:这里和我们的上一道题很类似。
我们一样使用经典的动态规划来做,时间复杂度在O(N×aim)。
如果我们arr的长度为N,目标钱值为aim。我们生成一个大小为N X aim的二维数组dp。dp[i][j]的含义是在只使用arr[0..i]货币的情况下,组成j所需要的最小张数。所以同样的计算方法如下:
1.dp[0..N-1][0]的值表示找的钱数为0的时候需要的最少张数,钱数为0时,完全不需要任何货币所以全部设置为0. 我们这里使用的是java初始化,所以不需要特意的去把数组初始化为0。
2.dp[0][0..aim]表示只能使用arr[0]货币的情况下找某个签署的最小张书。比如,arr[0]=2,那么能找开的钱数只能为2所以令dp[0][2]=1
其他位置都是找不开的,其余一律设为32位整数最大值,我们把这个值记为max。
3.基本步骤哦做完后,如果j-arr[i]<0,则dp[i][j]=dp[i-1][j]。
如果大于0则dp[i][j]=min{dp[i-1][j],dp[i-1][j-arr[i]]+1}。代码如下:
public int min(int[] arr,int aim){if(arr==null||arr.length==0||aim<0){
return -1;//正确性判断}int n = arr.length;int max = Integer.MAX_VALUE;int[][] dp=new int[n][aim+1];for(j=1;j<=aim;j++){dp[0][j]=max;//对于上面分析的第二步的初始化}if(arr[0]<=aim){dp[0][arr[0]]=1;//对该部分设置为1。}int tmp=0;//用来记录当前左上角for(int i=1;i<n;i++){for(int j=1;j<=aim;j++){tmp=max;if(j-arr[i]>=0&&dp[i-1][j-arr[i]]!=max){
tmp=dp[i-1][j-arr[i]]+1;
}
dp[i][j]=Math.min(tmp,dp[i-1][j]);
}}return dp[n-1][aim]!=max?dp[n-1][aim]:-1;
}
每日一题之动归-换钱的最少次数(二)相关推荐
- 【每日一题】 1319. 连通网络的操作次数
[每日一题] 1319. 连通网络的操作次数 避免每日太过咸鱼,一天搞定一道LeetCode算法题 一.题目描述 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1.线缆用 c ...
- 每日一题(21)——malloc与free(二)
char *GetMemory(void) {char p[] = "hello world";return p; }void Test(void) {char *str = NU ...
- 每日一题:leetcode1319.联通网络的操作次数
题目描述 题目分析 ps:这篇博客是补前天的,前天在老家不方便写博客 题目挺简单的,但是通过题目对图的连通性有了一个更深刻的认识:如果有超过(或等于)n-1条边,则一定是可以让整个图联通的. 如果想让 ...
- 每日一题——LeetCode977(有序数组的平方)二种方法
977. 有序数组的平方 难度:简单 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4,-1, ...
- 【Java每日一题】20170113
20170112问题解析请点击今日问题下方的"[Java每日一题]20170113"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017;p ...
- 【Java每日一题】20170309
20170308问题解析请点击今日问题下方的"[Java每日一题]20170309"查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; ...
- 【Java每日一题】20170302
为什么80%的码农都做不了架构师?>>> 20170301问题解析请点击今日问题下方的"[Java每日一题]20170302"查看(问题解析在公众号首发,公 ...
- 【Java每日一题】20170110
为什么80%的码农都做不了架构师?>>> 20170109问题解析请点击今日问题下方的"[Java每日一题]20170110"查看(问题解析在公众号首发,公 ...
- 【Java每日一题】20170116
20170113问题解析请点击今日问题下方的"[Java每日一题]20170116"查看 package Jan2017; public class Ques0116 { publ ...
最新文章
- KOAProgressBar
- ARM 位置无关代码(PIC)的分析理解
- 【建议收藏】Spring Boot注解全梳理!
- 编写一个求和函数sum,使输入sum(2)(3)或输入sum(2,3),输出结果都为5
- linux php常用命令,php调用Linux系统常用命令
- 孪生网络图像相似度_孪生网络:使用双头神经网络进行元学习
- 原生js和jquery常用的DOM操作
- Python面试准备
- 【实践】文本相关性和知识蒸馏在知识蒸馏中的应用实践
- python 字典处理_Python3 字典 in 操作符
- DockerCon 2017报告:企业在关注吗?
- pta c语言编程答案,PTA 程序设计 单选题-期末复习
- 【jmeter教程——从入门到熟练】
- PlatformIO for CLion 创建工程时出现 gathering information问题解决方法
- call_user_func_array函数详解
- 西门子PLC1200的S7通讯(同一项目下)--通讯测试
- 基于RBAC 的SAAS系统权限设计
- 国产积木---克尔维特(多图流量预警)
- 【MATLAB】根据已有数据绘制Bode图、时域曲线等(进阶版)
- android版本60支持云闪付,云闪付app下载-云闪付 安卓版v8.0.5-PC6安卓网