你正在安装一个广告牌,并希望它高度最大。这块广告牌将有两个钢制支架,两边各一个。每个钢支架的高度必须相等。
你有一堆可以焊接在一起的钢筋 rods
。举个例子,如果钢筋的长度为 1、2 和 3,则可以将它们焊接在一起形成长度为 6 的支架。
返回广告牌的最大可能安装高度。如果没法安装广告牌,请返回 0。
示例 1:
输入:[1,2,3,6]
输出:6
解释:我们有两个不相交的子集 {1,2,3} 和 {6},它们具有相同的和 sum = 6。
示例 2:
输入:[1,2,3,4,5,6]
输出:10
解释:我们有两个不相交的子集 {2,3,5} 和 {4,6},它们具有相同的和 sum = 10。
示例 3:
输入:[1,2]
输出:0
解释:没法安装广告牌,所以返回 0。
提示:
0 <= rods.length <= 20
1 <= rods[i] <= 1000
钢筋的长度总和最多为 5000
解题思路
对于这个问题首先想到的解决思路是通过DFS
。我们遍历rods
中的元素,我们对每个元素都有如下三种考量。
- 放左边
- 放右边
- 不放
当我们左边钢筋的长度left
和右边钢筋的长度right
是一样的时候,我们就需要记录这种情况下的最大值res
。我们在初始的时候需要记录一个最大容量maxsum
(sum(rods)
),我们每次遍历的过程中需要更新它,也就是我们每使用一个钢筋i
,我们就要将maxsum
减去相应的值rods[i]
。我们接着思路递归到底的情况。
- 遍历完
rods
的最后一个元素 - a b s ( l e f t − r i g h t ) > m a x s u m abs(left-right) > maxsum abs(left−right)>maxsum
- l e f t + r i g h t + m a x s u m < = r e s ∗ 2 left+right+maxsum<=res*2 left+right+maxsum<=r</