原题地址:https://leetcode.com/problems/coin-change/
这个题目可以用dfs来写,但是很容易超时,需要剪枝。
dp中有经典的背包九讲,而此题目正好是一种完全背包的模型。
首先看完全背包模型:
有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。放入第 i 种物品 的费用是 Ci,价值是 Wi。求解:将哪些物品装入背包,可使这些物品的耗费的费用总 和不超过背包容量,且价值总和最大。
N种物品和容量为V的背包,每种物品无限次可用。和此题目正好对应--不同面值的硬币,每种无限次可用。
完全背包问题,按照01背包的思路,可写出如下状态转移方程:
令 F[i,v] 表示前 i 种物品恰放入一个容量为 v 的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程:
F[i,v] = max{F[i − 1, v − k*Ci ] + k*Wi | 0 ≤ k*Ci ≤ v}
解释一下就是,对第i种物品,可以取k件,也可以不取;遍历所有可能的k得到最大值即为F[i,v]。
对于本题,类比如下:
//j - k*c[i] >= 0 && k>0
dp[i][j]