给定不同面额的硬币 coins 和一个总金额 amount,可以有多个不同的拼凑方法?
一:coins = [1, 2], amount = 10
1.假如,你现在有十块钱硬币了,你是怎么凑够的?
有两种可能:一是先要有9块钱再加上一块钱的硬币,二是先要有8块钱再加上一个两块的硬币
2.这9块钱怎么来的?
有两种可能:一是先要有8块钱再加上一块钱的硬币,二是先要有7块钱再加上一个两块的硬币
........
一层层的往下推,最终到两块钱、一块钱
同理,我们是不是可以抽象成:dp[i]=dp[i-1]+dp[i-2];是不是很熟悉,对,就是和爬楼梯一样的
再加一点难度,多了一种5块的硬币
二:coins = [1, 2,5], amount = 10
1.现在10块钱是怎么凑的?
一是先要有9块钱再加上一块钱的硬币,二是先要有8块钱再加上一个两块的硬币,三是先有5块钱再加一个5块的硬币;
2.这9块钱怎么来的?8块钱怎么来的?5块钱怎么来的?
同理,我们很容易想到:dp[i]=dp[i-1]+dp[i-2]+dp[i-5]
再加一点难度,拼凑成目标钱数,需要硬币数量最少,怎么拼?如10块钱,只需要两个5块的就够了
三:coins = [1, 2,5], amount = 25
拼凑成25块钱时,要的硬币数最少:转化为拼凑成24块钱需要的硬币数最少+1个一块的硬币,或者拼凑成23块钱需要的硬币数最少+1个两块的硬币,或者拼凑成20块钱需要的硬币数最少+1个5块的硬币;这三种可能,取最少的个数
再递推下去,24块钱、23块钱、20块需要的硬币数哪个最少?
也即 dp[25]=min{dp[24], dp[23], dp[20]}+1
dp[24]=min{dp[23], dp[22], dp[19]}+1.....
dp[i]=min{dp[i-单个硬币面值]}+1,如果用cons[j]这个数组表示单个硬币面值的集合,则
dp[i]=min{dp[i-coins[j]]}+1
同样,我们要知道dp[i]数组的初始值,dp[1]=1,dp[2]=1,dp[3]=2,dp[4]=2(两个两块的),dpp[5]=1(一个5块的)
有了初始值和方程数组,我们可以求任意金额需要的最少硬币个数值