题目描述

给定arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数

解题思路

  • dp[i][j]表示只用第0到i种货币,凑成j元的最小货币张数。
  • 初始化第一行
  • 初始化中,无法凑成的初始化为Integer.MAX_VALUE-1否则+1会爆精度变为负数。

转移方程:

  • dp[i][j]=min{dp[i-1]【j-k*arr[i]】+k} (k>=0)
  • 整理得 dp[i][j]=min{dp[i-1][j],min{dp[i-1]【j-k*arr[i]】+k}} (k>=1)
  • 变换得 dp[i][j]=min{dp[i-1][j],min{dp[i-1]【j-(y+1)*arr[i]】+(y+1)}} (y>=0)
  • 整理得 dp[i][j]=min{dp[i-1][j],min{dp[i-1]【j-arr[i]-y*arr[i]】+y+1}} (y>=0)
  • 变换得最终转移方程:
dp[i][j]=min{dp[i-1][j],dp[i]【j-arr[i]】+1}    (j-arr[i]>=0)
dp[i][j]=dp[i-1][j] (j-arr[i]<0)

含义上,即:用arr[0]-arr[i]的面值凑j的需要的最少张数=min{不用arr[i]凑j的最少张数,至少用一张arr[i]凑j-arr[i]的最少张数+1张}

代码采用空间压缩,使用一维的dp数组。

待做

感觉是完全背包,与经典问题中各量的对应关系思考一下。

代码

public class Solution {
public int getCoinsCount(int arr[],int aim){
int[] dp=new int[aim+1]; //initial
for(int j=0;j<=aim;++j) {
dp[j]=Integer.MAX_VALUE-1;//
}
for(int k=0;arr[0]*k<=aim;++k) {
dp[arr[0]*k]=k;
} for(int i=1;i<arr.length;++i) {
for(int j=arr[i];j<=aim;++j) {
dp[j]=Math.min(dp[j], dp[j-arr[i]]+1);
}
} if(dp[aim]==Integer.MAX_VALUE-1) {
return -1;
}
else {
return dp[aim];
}
}
}

[程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)的更多相关文章

  1. [程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)

    题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数. 解题思路 完全背包 和"求换钱的 ...

  2. [程序员代码面试指南]递归和动态规划-数字字符串转换为字母组合的种数(DP)

    题意 给一个字符串,只由数字组成,若是'1'-'26',则认为可以转换为'a'-'z'对应的字母,问有多少种转换方法. 题解 状态转移很好想,注意dp多开一位,dp[0]为dp[2]的计算做准备.dp ...

  3. [程序员代码面试指南]递归和动态规划-排成一条线的纸牌博弈问题(DP)

    题目 给定一个整型数组arr,代表数值不同的纸牌排成一条线.玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明.请返回最后获 ...

  4. [程序员代码面试指南]递归和动态规划-最小编辑代价(DP)

    问题描述 输入 原字符串StrOrg,目标字符串StrTarget,插入.删除.替换的编辑代价ic,dc,rc.输出将原字符串编辑成目标字符串的最小代价. 解题思路 状态表示 dp[i][j]表示把s ...

  5. [程序员代码面试指南]递归和动态规划-最长公共子串问题(DP,LCST)

    问题描述 如题. 例:输入两个字符串 str1="1AB234",str2="1234EF" ,应输出最长公共子串"234". 解题思路 状 ...

  6. [程序员代码面试指南]递归和动态规划-机器人达到指定位置方法数(一维DP待做)(DP)

    题目描述 一行N个位置1到N,机器人初始位置M,机器人可以往左/右走(只能在位置范围内),规定机器人必须走K步,最终到位置P.输入这四个参数,输出机器人可以走的方法数. 解题思路 DP 方法一:时间复 ...

  7. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

  8. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  9. [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)

    题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...

随机推荐

  1. 汇编 | x86汇编指令集大全(带注释)

    做mit-6.828的时候遇到了很多汇编知识,但是无奈学校还没学汇编,只能狠心啃啃硬骨头,在网上查到了很多的资料,归档!方便查看 ----------------------------------- ...

  2. EXCEL 中数据 批量 填充进 word 中

    工具:Python3.7 需求描述:将EXCEL中 第二行 数据 填在 word 对应位置上,然后保存为 "姓名+任务.docx"文件. 再将EXCEL中 第三行 数据 填在 wo ...

  3. xpath和css选择器对比

    基本语法对比 都可以在html中提取内容,但xpath可以提取xml的内容.

  4. Azure认知服务之使用墨迹识别功能识别手写汉字

    前面我们使用Azure Face实现了人脸识别.使用Azure表格识别器提取了表格里的数据.这次我们试试使用Azure墨迹识别API来对笔迹进行识别. 墨迹识别 墨迹识别器认知服务提供基于云的 RES ...

  5. 【故障公告】阿里云 RDS 数据库突发 CPU 近 100% 引发全站故障

    今天晚上9点我们收到阿里云的告警通知: [阿里云监控]华东1(杭州)-云数据库RDS版<cnblogsdb> [instanceId=xxx] 于21:00 发生告警, 前往诊断 CPU使 ...

  6. SparkSQL DSL开发(Old)

    import org.apache.spark.sql.SQLContextimport org.apache.spark.sql.expressions.Windowimport org.apach ...

  7. go 多线程并发 queue demo

    原文链接:Writing worker queues, in Go 1.work.go [root@wangjq queue]# cat work.go package main import &qu ...

  8. 如何理解Vue.js中的ref及$ref,$

    1.vue官方文档 首先我们来看一下vue官方是怎么解释的 好了,我知道很多刚接触的vue的小白其实都不太看的懂官方文档在讲什么,下面我用自己的话翻译一下. 2.ref以及$ref 通过 ref 标注 ...

  9. 访问github太慢?我写了一个开源小工具一键变快

    前言 GitHub应该是广大开发者最常去的站点,这里面有大量的优秀项目,是广大开发者寻找资源,交友学习的好地方.尤其是前段时间GitHub公布了一项代码存档计划--Arctic Code Vault, ...

  10. vmd与ovito的对比

    1.minimize后,lammps生成的data文件 2.pdb: