ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

动态规划算法

2021-07-31 23:34:14  阅读:168  来源: 互联网

标签:缓存 minCoinNum 硬币 amount 算法 int64 动态 规划 minNum


要点

  • 简化问题
  • 减少计算量

套路

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

硬币找零问题

问题:有三种面值硬币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))
}

标签:缓存,minCoinNum,硬币,amount,算法,int64,动态,规划,minNum
来源: https://www.cnblogs.com/ledao/p/15085633.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有