leetcode 377 Combination Sum IV 详细解答
上来无脑用回溯,像 leetcode 77 。
代码如下:
结果超时。所以只能换个思路。
举例说明:
n
u
m
s
=
[
1
,
2
,
3
]
t
a
r
g
e
t
=
4
nums = [1, 2, 3] \\target = 4
nums=[1,2,3]target=4
1 → [ 1 ] 1 → [1] 1→[1]
2 → [ 1 , 1 ] , [ 2 ] 2 → [1, 1], [2] 2→[1,1],[2]
3 → [ 1 , 1 , 1 ] , [ 1 , 2 ] , [ 2 , 1 ] , [ 3 ] 3 → [1, 1, 1], [1, 2], [2, 1], [3] 3→[1,1,1],[1,2],[2,1],[3]
4 → [ 1 , 1 , 1 , 1 ] , [ 1 , 1 , 2 ] , [ 1 , 2 , 1 ] , [ 1 , 3 ] , [ 2 , 1 , 1 ] , [ 2 , 2 ] , [ 3 , 1 ] 4 → [1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 3], [2, 1, 1], [2, 2], [3, 1] 4→[1,1,1,1],[1,1,2],[1,2,1],[1,3],[2,1,1],[2,2],[3,1]
通过举例我们可以发现,这是个背包问题
包就是4,硬币就是 [1,2,3]
如果要求的 dp[4],
(1)如果将 1 放入背包,那么背包就只有 3 的剩余,即是求 dp[3]
(2)如果将 2 放入背包,那么背包就只有 2 的剩余,即要求的是 dp[2]
(3)如果将 3 放入背包,那么背包就只有 1 的剩余,即要求的是 dp[1]
. . . . . . ...... ......如果target是7,8也是一样的求法。
最后总结出来的状态转移方程。
f
(
i
)
表
示
t
a
r
g
e
t
=
i
时
的
组
合
数
,
在
i
>
=
n
u
m
前
提
下
:
f(i)表示target = i时的组合数, 在 i >= num前提下:
f(i)表示target=i时的组合数,在i>=num前提下:
f
(
i
)
=
∑
n
u
m
∈
n
u
m
s
f
(
i
−
n
u
m
)
f(i)=\sum_{num\in{nums}}f(i-num)
f(i)=num∈nums∑f(i−num)
具体代码如下:
参考别人的代码改进了一下: