首先需要明白 0-1 背包问题中的放置表格,见 “玩转算法面试 从真题到思维全面提升算法思维” 9-5 节,本题思路类似
表格纵向为:只考虑第 [0 …,… index] 种硬币(物品)
表格横向为:需要兑换的金额(背包容量)为 j
表格内容为:在横向和纵向的条件下,最少的硬币(物品)数
即:通过表格列举出,当硬币种类为 [0 …,… index] 种,兑换金额为 j 时,最少的硬币数量


以 Example 1 为例,可以画出下面的表格

Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1

硬币&金额 0 1 2 3 4 5 6 7 8 9 10 11
1 0 1 2 3 4 5 6 7 8 9 10 11
2 0 1 1 2 2 3 3 4 4 5 5 6
5 0 1 1 2 2 1 2 2 3 3 2 3

第一行:当只考虑面值为 1 的硬币时,兑换总金额为 0 1 2 3… 时,最少需要 0 1 2 3… 个
从第二行开始是关键,举例来说:
若想求只考虑面值为 1 和 2 的硬币时,兑换总金额为 7 最少有几种情况,即表格里加粗的数字是多少,可以这样考虑:
所求的问题可以拆分成这两种情况:
(1) 不使用面值为 2 的进行兑换,则问题变为 “只考虑面值为 1 的硬币时,兑换总金额为 7 最少有几种情况”,这个问题在第一行已经解决,就是上一格的元素,7
(2) 使用至少一个面值为 2 的进行兑换,首先拿一个 2,这样用了一个硬币,剩余金额为 7 - 2 = 5
子问题变为 “考虑面值为 1 和 2 的硬币,兑换总金额为 5” 最少有几种情况,注意子问题仍还需要 “考虑面值为 1 和 2”,而不是只考虑 1,因为可以使用多次 2!,这个子问题的解就是第二行纵坐标为 5 的格子元素的值,即为 3,加上之前用过的一个 “2”,所以需要 3 + 1 = 4 个。

同样,第三行拆分成 “不使用面值为 5 的进行兑换,即只考虑面值为 1 2” 和 “使用至少一个面值为 5 的进行兑换”
比如第 i 行第 j 列,第 i 行(从0开始)对应的面值是 coins[i],第一种情况为 table[i - 1][j],第二种情况为 table[i][j - coins[i]] + 1,取两者最小值即可。不过要注意如果其中一种情况兑换不了,那格子元素的值只能是能兑换的那种情况的值,如果两种情况都兑换不了,就记为 -1,这样双重循环填满这个表格,右下角的元素即为问题的解。

源自于:http://www.imooc.com/article/288317

用背包问题思路解决 322. Coin Change(完全背包)的更多相关文章

  1. LeetCode OJ 322. Coin Change DP求解

    题目链接:https://leetcode.com/problems/coin-change/ 322. Coin Change My Submissions Question Total Accep ...

  2. [LeetCode] 322. Coin Change 硬币找零

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  3. 322. Coin Change选取最少的硬币凑整-背包问题变形

    [抄题]: You are given coins of different denominations and a total amount of money amount. Write a fun ...

  4. LeetCode 322. Coin Change

    原题 You are given coins of different denominations and a total amount of money amount. Write a functi ...

  5. dp:322. Coin Change 自下而上的dp

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  6. leetcode@ [322] Coin Change (Dynamic Programming)

    https://leetcode.com/problems/coin-change/ You are given coins of different denominations and a tota ...

  7. 322. Coin Change

    动态规划里例题,硬币问题. p[i] = dp[i - coin[j]] + 1; 注意i < coin[j] dp[i-coin[j]]无解都要跳过. public class Solutio ...

  8. 322. Coin Change零钱兑换

    网址:https://leetcode.com/problems/coin-change/ 典型的动态规划问题,类比背包问题,这就是完全背包问题 问题的阶段:对数值 i 凑硬币 问题的状态:对数值 i ...

  9. [LC] 322. Coin Change

    You are given coins of different denominations and a total amount of money amount. Write a function ...

随机推荐

  1. java8接口

    // 可以用来做工具类// 这个注解是函数式注解,表示这个接口里面有且仅有一个抽象方法, 默认方法可以有0个或多个@FunctionalInterfacepublic interface Interf ...

  2. python3解决url编码与解码

    对于url编码的转换,主要用urllib.parse包中的quote和unquote方法. quote进行解码,unquote进行编码. 代码实例: import urllib.parse u = & ...

  3. python pyquery 基本用法

    1.安装方法 pip install pyquery 2.引用方法 from pyquery import PyQuery as pq 3.简介 pyquery 是类型jquery 的一个专供pyth ...

  4. for(var i in items) 和 for(var i;i<items.length;i++) 区别

    前者循环的是属性,后者循环的才是数组. 若项目中对数组属性进行了扩展,那切记不能使用前者,否则在循环数组时扩展的函数体也会被当做数据返回. var data = { p1:1, p2:"b& ...

  5. Python参数类型以及实现isOdd函数,isNum函数,multi函数,isPrime函数

    Python参数类型以及实现isOdd函数,isNum函数,multi函数,isPrime函数 一.Python参数类型 形参:定义函数时的参数变量. 实参:调用函数时使用的参数变量. 参数传递的过程 ...

  6. iptraf: command not found

    在Linux上安装iptraf,然后执行命令时报错,iptraf: command not found 解决办法:iptraf-ng包的二进制文件是iptraf-ng.使用命令iptraf-ng即可 ...

  7. Noip2016Day1T2 天天爱跑步

    题目链接 problem solution 这是一道一个顶六个的好题!!! 说一下各档部分分怎么写吧. 先看一下\(S_i=1\)和\(T_i=1\)的部分分怎么写. 如果\(S_i=1\) 当且仅当 ...

  8. Python程序中的线程操作-线程队列

    目录 一.线程队列 二.先进先出 三.后进先出 四.存储数据时可设置优先级的队列 4.1 优先级队列 4.2 更多方法说明 一.线程队列 queue队列:使用import queue,用法与进程Que ...

  9. 暑期班--JAVA无敌课程---第一天-Day01-----Java基础

    1.Java发展历史 1.1Games Golsing Java创始人 2.What is JDK 3.记本本开发第一个Java程序 巴拉巴拉 巴拉巴拉 巴拉巴拉 巴拉巴拉 巴拉巴拉 巴拉巴拉 巴拉巴 ...

  10. golang数据结构之栈

    stack.go package stack import ( "errors" "fmt" ) type Stack struct { MaxTop int ...