题目:上一道题是给定一个钱的数组,可以使用任意张数。接下来改变一下题目:给定数组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;
}

每日一题之动归-换钱的最少次数(二)相关推荐

  1. 【每日一题】 1319. 连通网络的操作次数

    [每日一题] 1319. 连通网络的操作次数 避免每日太过咸鱼,一天搞定一道LeetCode算法题 一.题目描述 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1.线缆用 c ...

  2. 每日一题(21)——malloc与free(二)

    char *GetMemory(void) {char p[] = "hello world";return p; }void Test(void) {char *str = NU ...

  3. 每日一题:leetcode1319.联通网络的操作次数

    题目描述 题目分析 ps:这篇博客是补前天的,前天在老家不方便写博客 题目挺简单的,但是通过题目对图的连通性有了一个更深刻的认识:如果有超过(或等于)n-1条边,则一定是可以让整个图联通的. 如果想让 ...

  4. 每日一题——LeetCode977(有序数组的平方)二种方法

    977. 有序数组的平方 难度:简单 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4,-1, ...

  5. 【Java每日一题】20170113

    20170112问题解析请点击今日问题下方的"[Java每日一题]20170113"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017;p ...

  6. 【Java每日一题】20170309

    20170308问题解析请点击今日问题下方的"[Java每日一题]20170309"查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; ...

  7. 【Java每日一题】20170302

    为什么80%的码农都做不了架构师?>>>    20170301问题解析请点击今日问题下方的"[Java每日一题]20170302"查看(问题解析在公众号首发,公 ...

  8. 【Java每日一题】20170110

    为什么80%的码农都做不了架构师?>>>    20170109问题解析请点击今日问题下方的"[Java每日一题]20170110"查看(问题解析在公众号首发,公 ...

  9. 【Java每日一题】20170116

    20170113问题解析请点击今日问题下方的"[Java每日一题]20170116"查看 package Jan2017; public class Ques0116 { publ ...

最新文章

  1. KOAProgressBar
  2. ARM 位置无关代码(PIC)的分析理解
  3. 【建议收藏】Spring Boot注解全梳理!
  4. 编写一个求和函数sum,使输入sum(2)(3)或输入sum(2,3),输出结果都为5
  5. linux php常用命令,php调用Linux系统常用命令
  6. 孪生网络图像相似度_孪生网络:使用双头神经网络进行元学习
  7. 原生js和jquery常用的DOM操作
  8. Python面试准备
  9. 【实践】文本相关性和知识蒸馏在知识蒸馏中的应用实践
  10. python 字典处理_Python3 字典 in 操作符
  11. DockerCon 2017报告:企业在关注吗?
  12. pta c语言编程答案,PTA 程序设计 单选题-期末复习
  13. 【jmeter教程——从入门到熟练】
  14. PlatformIO for CLion 创建工程时出现 gathering information问题解决方法
  15. call_user_func_array函数详解
  16. 西门子PLC1200的S7通讯(同一项目下)--通讯测试
  17. 基于RBAC 的SAAS系统权限设计
  18. 国产积木---克尔维特(多图流量预警)
  19. 【MATLAB】根据已有数据绘制Bode图、时域曲线等(进阶版)
  20. android版本60支持云闪付,云闪付app下载-云闪付 安卓版v8.0.5-PC6安卓网

热门文章

  1. 采用igraph包分析网络数据
  2. 【python做接口测试的学习记录day9——pytest自动化测试框架之yaml数据驱动封装】
  3. Glide,AndroidX包兼容问题
  4. Spark on Hive Hive on Spark傻傻分不清?
  5. 500台机以上大型网吧设计方案(转)
  6. 引入winrt头文件时提示there are too many errors for the intellisense engine to function properly
  7. 前端面试题及答案(字节跳动)(二)
  8. WIN10DOS命令
  9. HTML5 基础总结
  10. 【JAVA百炼成仙】特别篇——(三个IO练习题)