找零钱问题
amount = 1…n
int[] coins = new int[m]{ }
自底向上 每一步都有k种硬币值(硬币值要小于amount)选择,每一步都选择让硬币数最小的硬币值,那么最终的硬币数量就是最小的
组合:amount由不同硬币值组成,使硬币数量最小。
状态:dp[i]
状态转移:dp[i] = min(dp[i - Cj] + 1, dp[i])
初始化:dp[i] = i
边界:dp[0] = 0
找完全数问题
和找零钱一模一样,只不过coins = square_nums = new int[m] {i^2, }
num = 1…n
int[] square_nums = new int[m]{1, 4, 9, 16}
自底向上 每一步都有m中选择,每一步都有k种完全平方数选择(完全平方数要小于num), 每一步都选择让完全平方数个数最小的完全平方数,那么最终的硬币数就是最小的。
组合优化问题
找路径,找组合,找方法一般可以使用回溯法