找零钱问题
假设,老王有N张纸币,纸币的面值用arr[N]表示,现在老王要给隔壁的老李M元钱,请问,如何组合手中的纸币,使给出的纸币张数最少?如果可以,返回最少的纸币张数,否则返回-1。
问题分析
假如要给老李10元钱,老王的手中又有一张5元的纸币,那么,能使用该5五元钱的的情况必须是其他的纸币能组合成剩下的5元钱。 -》 动态规划问题!!!
基础算法,用一个 N*(M+1) 维的数组res来作为状态数据,依次从左到右,从上到下,更新数组状态,最终res[N-1][M]就是所得的最佳结果。
这样,算法的时间复杂度是 N*(m+1);空间复杂度是N*(m+1);如下Python代码所示:
# -*- coding:utf-8 -*-
def minCoins(arr,aim):
if( len(arr) == 0 or aim <0):
return -1
n = len(arr)
matrix = []
for i in range(0,n):
temp = []
temp.append(0)