动态规划特点:
- 重复子问题
- 状态转移方程(最关键)
- 最优子结构
题型:求最值
核心: 穷举
解题套路:
- 明确状态
- 明确选择
- 明确dp函数/数组的定义
- 明确base case
# 暴力求解(超时,通过不了)
class Solution {
// 状态:目标金额 amount
// 选择:coins 数组中列出所有硬币面额
// 函数的定义:凑出总金额amount,至少需要coinChange(coins,amount)枚硬币
// base case: amount = 0时,需要0枚硬币;amount<0时,不可能凑出
// coinChage([1,2,5],11)
// = 1 + min(coinChage([1,2,5],10),coinChage([1,2,5],9,coinChage([1,2,5],6))
int[] memo;
public int coinChange(int[] coins, int amount) {
// base case
if(amount==0) return 0;
if(amount<0) return -1;
int res = Integer.MAX_VALUE;
for(int coin : coins){
// 计算子问题的结果
int subProblem = coinChange(coins,amount-coin);