Skip to content

Commit 7fdc6c8

Browse files
authored
Update Readme.md
1 parent cbf9b82 commit 7fdc6c8

File tree

1 file changed

+9
-8
lines changed
  • Dynamic_Programming/416.Partition-Equal-Subset-Sum

1 file changed

+9
-8
lines changed

Dynamic_Programming/416.Partition-Equal-Subset-Sum/Readme.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,19 @@
55
于是我们可以换一个“答案空间”去切入,那就是用背包问题的想法。DFS的解法其实是寻找在一个N维空间上搜索答案(1,0,0,....,0,1,1),其中0/1表示该数字我们是否选择。显然这个空间的候选数目的order达到了指数级别。“背包问题”就是改变解答空间,思考如果我们构建任意和为s的subset的话,是否能够实现目标。对于s而言,它的范围是从0到nums.size()*nums[i]=2e4. 这个空间是大大缩小的了。举个例子,假如dp[10]=true表示我们可以选择一部分数字加起来是10,那么我们试图思考,我们能否利用这部分数字再加上一些其他数字,使得总和是20呢?也就是说,我们能否通过dp[10]=true来帮助判断dp[20]=true呢?
66

77
这就是01背包问题的基本思想。如果dp的空间大小合理,那么我们就可以来解决之前DFS所无法处理的复杂度。基本的模板如下:
8-
```
9-
for (auto x: nums) // 遍历物品
10-
for (auto s= sum/2 to 0) // 遍历容量
11-
if dp'[s-x] = true
8+
```cpp
9+
for (int i=0; i<n; i++) // 遍历物品
10+
for (int s= sum/2 to 0) // 遍历容量
11+
if dp[i-1][s-x] = true
1212
dp[s] = true // 如果考察x之前,已经能够凑出s-x,那么加上x这个数字就一定能凑出和为x的subset。
1313
```
1414

1515
此外还有另外一种dp的写法
1616
```
17-
for (auto x: nums) // 遍历物品
18-
for (auto s= sum/2 to 0) // 遍历容量
19-
if dp'[s] = true
20-
dp[s+x] = true // 如果考察x之前,已经能够凑出s,那么加上x这个数字就一定能凑出和为s+x的subset。
17+
```cpp
18+
for (int i=0; i<n; i++) // 遍历物品
19+
for (int s= sum/2 to 0) // 遍历容量
20+
if dp[i][s] = true
21+
dp[i+1][s+x] = true // 如果考察x之前,已经能够凑出s,那么加上x这个数字就一定能凑出和为s+x的subset。
2122
```
2223

0 commit comments

Comments
 (0)