1. 数学方法
时间O(n)
,空间O(1)
,不过要是能继续把公式往下推的话,可能会有时间O(1)
吧。
![draft](/coin-lcci/draft.png)
1 | class Solution { |
2. 完全背包的方案数
背包容量:n
物品价值:1, 5, 10, 25
物品体积:1, 5, 10, 25
要求恰好装满容量为n的背包,并求解方案数。
用完全背包:时间O(NV) = O(4*n) = O(n)
,空间O(n)
如果是求恰好装满的最大价值,则是普通的完全背包问题。
初始化dp[i] = -INF; dp[0] = 0
转移是dp[i] = max(dp[i], dp[i - w[i]] + v[i])
而现在是求恰好装满的方案数,是一个变种的完全背包问题。
初始化dp[i] = 0
,代表初始时没有方案可以满足完全装满容量为i的背包。
初始化dp[0] = 1
,代表容量为0的背包恰好装满有1种方案。
转移是dp[i] = dp[i] + dp[i - w[i]]
,代表容量为i的背包恰好装满取决于上一次(只看前部分的物品)装满容量为i的背包的方案数(不装当前物品)+上一次装满容量为i-w[i]
的背包的方案数(装上当前物品)。
1 | class Solution { |