零钱兑换II
Last updated
Last updated
问题简述
思路1:递归
定义 dfs(a, i)
表示目标钱数为 a
且从第 i
种硬币开始取能得到的组合数;
“从第
i
种硬币开始取”具体指第i
种之后的硬币可以任意取,前面的i-1
种不能取,详见代码;
递归基
规定 dfs(0,i) == 1
;
隐含中止条件:当 coins[i] > j
时,dfs(a,i) == 0
;
思路2:动态规划——基于完全背包的组合数问题
定义 dp[a]
表示构成目标值 i
的组合数;
转移方程 dp[a] += dp[a - coins[i]]
,当 a >= coins[i]
时;
初始状态 dp[0] = 1
;
关键点:先遍历“物品”(这里是硬币),在遍历“容量”(这里是金额);
关于先后遍历两者的区别见完全背包 - 代码随想录;