DP
1 | class Solution { |
DP
1 | class Solution { |
设第 i 个硬币的价值为 wi,设我们最多可以使用 k 次该硬币:
- 当不使用第 i 个硬币时,dp[i][j] = dp[i - 1][j]
- 当使用 1 次第 i 个硬币时,dp[i][j] = dp[i - 1][j - wi] + 1
- 当使用 2 次第 i 个硬币时,dp[i][j] = dp[i - 1][j - 2 * wi] + 2
- 当使用 k 次第 i 个硬币时,dp[i][j] = dp[i - 1][j - k * wi] + k
易知:dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - wi] + 1, dp[i - 1][j - 2 * wi] + 2, … dp[i - 1][j - k * wi] + k) ①
令 j = j - wi,因为少了一个 wi,所以能够使用的最大硬币数为 k - 1:
易知:dp[i][j - wi] = min(dp[i - 1][j - wi], dp[i - 1][j - 2 * wi] + 1, dp[i - 1][j - 3 * wi] + 2, … dp[i - 1][j - wi - (k - 1) * wi] + k - 1)
化简:dp[i][j - wi] = min(dp[i - 1][j - wi], dp[i - 1][j - 2 * wi] + 1, dp[i - 1][j - 3 * wi] + 2, … dp[i - 1][j - k * wi] + k - 1) ②
将 ② 式替换 ① 式中后面 k - 1 项后得到化简后的 ① 式:
dp[i][j] = min(dp[i - 1][j], dp[i][j - wi] + 1)
DP
1 | class Solution { |