1.简介:
在leetcode上刷题的时候,遇到了一道找零钱的动态规划题,后台测试用例很变态,必须把算法优化的很好才能通过。也借此机会好好的研究了一下动态规划。在下小白一个,大神轻喷。
2.题目如下:
image.png
分析:我们可以从最简单的暴力搜索开始,先优化成记忆搜索方法,再到动态规划,最后再对动态规划进行空间优化。
1)最简单的思路就是用暴力搜索的方法,枚举每一种情况,累加求和,但存在大量重复计算。时间复杂度 > O((amount * coins.length)²)
2)进一步我们可以优化成记忆搜索方法,将每一个计算结果保存下来,用空间换时间,减少重复计算。时间复杂度 = O((amount * coins.length)²)
3)在记忆搜索的基础上,优化成动态规划,规划好路径,消除重复计算。和记忆搜索一样,用空间换时间。
时间复杂度O(amount * coins.length)
2.暴力搜索法
暴力搜索即用穷举法解决,穷举每一种可能再累加,基于示例1来看
1)结果 = 当不用coins[0]硬币时的组合数 +
使用1个coins[0]硬币时的组合数 +
使用2个coins[0]硬币时的组合数 +
...
使用5个coins[0]硬币时的组合数。
2)不使用coins[0]硬币 = 不使用coins[1]硬币 +
使用1个coins[1]硬币 +
使用2个coins[1]硬币+
...
对每个子项累加等于amount时返回1,否则0
可以用amount累减来代替累加
代码如下:
public void solveCutCoin(int[] coins, int amount){
System.out.println(codeCutCoin(coins, 0, amount));
}
//返回coinArr[index...N-1]种硬币的分割方法
public int codeCutCoin(int[] coins, int index,