美文网首页
动态规划算法

动态规划算法

作者: ledao | 来源:发表于2018-09-14 13:26 被阅读0次

要点

  • 简化问题
  • 减少计算量

套路

  • 定义状态
  • 定义动作
  • 定义边界
  • 缓存已知

硬币找零问题

问题:有三种面值硬币1,3,5,且无限量,请问共需要找零n元,最少需要几枚硬币?
定义状态:minCoinNum(n), 即n元需要的最小硬币数目。
定义动作(分而治之):假如我知道了minCoinNum(n-1)、minCoinNum(n-3)、minCoinNum(n-5)的最少硬币数目,则为n元时,最少硬币数目为:min(minCoinNum(n-1)+1, minCoinNum(n-3)+1, minCoin(n-5)+1)。将n元分为n-1元、n-3元、n-5元,然后选择一个最小的方案。
定义边界:当n<1时,没有余额 ,需要0个硬币,当n等于1、3、5时,需要1个硬币。
缓存已知:minCoinNum(n)作为可能多次计算的数值,由于每次计算都一样,可以将结果缓存起来,避免不必要的计算。

简单的递归版本(无缓存已知的计算状态)代码

package main

import "math"

var coins []int64

func init() {
    coins = []int64{5, 3, 1}
}

func coinSum(amount int64) int64 {
    if amount < 1 {
        return 0
    }

    var minNum int64 = math.MaxInt64
    for _, v := range coins {
        if amount < v {
            continue
        }
        if amount == v {
            return 1
        }
        minNum = int64(math.Min(float64(minNum), float64(coinSum(amount-v)+1)))
    }
    return minNum
}

func main() {
    var amount int64 = 7
    println(coinSum(amount))
}

相关文章

  • 动态规划算法

    动态规划算法 最长上升子序列

  • 维特比算法

    维特比(Viterbi)算法是一种动态规划算法,在处理隐马尔可夫(HMM)最优路径问题时经常被使用. 动态规划算法...

  • 最短路径解决方法

    Floyd算法;Dijkstra算法;Bellman-Ford算法;动态规划算法

  • 背包问题

    介绍 学习动态规划算法的经典例题。动态规划算法一般有3个特征1、最优化原理:最优解所包含的子问题的解也是最优的。2...

  • 动态规划算法(01背包问题)

    一. 动态规划算法介绍: 动态规划算法和分治算法类似,也是将待求解问题分成若干个小问题一步步求解,不同的是,每一个...

  • 基础算法

    二分查找 冒泡排序(优化) 归并排序 动态规划算法

  • 动态规划入门

    1.什么是动态规划动态规划是在前面已有答案的基础上向下递推的过程 动态规划算法的两种形式上面已经知道动态规划算法的...

  • 【JS算法】动态规划 - 斐波那契数列

    动态规划算法 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。其基本思想也...

  • 2019-11-04 回溯算法

    package others; import java.util.Arrays; /** 动态规划算法计算10个工...

  • 动态规划

    动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...

网友评论

      本文标题:动态规划算法

      本文链接:https://www.haomeiwen.com/subject/jakogftx.html