今天主要通过一个经典的问题来讲解贪心策略和动态规划。
贪心策略概念就是:每一步都采取当前状态下最优的选择(局部最优解),从而希望推导出全局最优解。
动态规划的核心思想是:通过求解子问题的最优解,然后推导出原问题的最优解。
本文先介绍下贪心算法的缺点进而引出动态规划以及动态规划的解题中间的详细流程。
题目来源于 LeetCode 的第 206 题,难度为:中等。目前的通过率是43.6%。
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
你可以认为每种硬币的数量是无限的。
子题目:假设有 25 分、20 分 、10 分、5 分、1 分的硬币,现要找给客户 41 分的零钱,如何办到硬币个数最少?
1.贪心策略
◼ 贪心策略:每一次都优先选择面值最大的硬币
-
选择 25 分的硬币,剩 16 分
-
选择10分的硬币,剩6分
-
选择5分的硬币,剩1分
-
选择 1 分的硬币
最终的解是共 4 枚硬币:25 分、10 分、5 分、1 分硬币各一枚let faces = [1, 5, 10, 25] //先调成升序 var target = 41 greedy(faces: faces, target: &target) func greedy(faces: [Int], target: inout Int) -> Int { var count = 0 var index = faces.count - 1 while index >= 0 {