给你一个数组,问你是否能将数组分成 4 等份,即每一份的数字总和都相等,你不能拆分数组中的数字,如果能得到有效划分就返回 true,否则返回 false。 输入输出格式的实现源代码
时间: 2023-11-25 15:08:22 浏览: 101
数字拆分源代码非常好懂
可以这样实现:
```python
n = int(input())
nums = list(map(int, input().split()))
total_sum = sum(nums)
if total_sum % 4 != 0:
print("false")
else:
target = total_sum // 4
count = [0] * 4
nums.sort(reverse=True)
def dfs(pos):
if pos == n:
return count[0] == count[1] == count[2] == target
for i in range(4):
if count[i] + nums[pos] <= target:
count[i] += nums[pos]
if dfs(pos + 1):
return True
count[i] -= nums[pos]
return False
if dfs(0):
print("true")
else:
print("false")
```
代码思路如下:
首先计算出数组中所有数字的总和 total_sum,如果 total_sum 不能被 4 整除,那么肯定不能将数组分成 4 等份,直接输出 false。
否则我们可以将数组中的数字从大到小排序,这样在搜索过程中可以先尝试将较大的数字分配给数组的前面几份。
然后我们定义一个 dfs 函数,该函数用于搜索是否存在一种分配方案,使得每一份的数字总和都等于 target,其中 target = total_sum // 4。
dfs 函数的参数 pos 表示当前考虑到的数组下标,count 数组表示每一份目前已经分配的数字总和。
在搜索过程中,我们尝试将当前位置的数字分配给四个不同的集合中,如果分配后某个集合的数字总和不超过 target,那么递归搜索下一个位置。如果最终每个集合的数字总和都等于 target,那么说明可以将数组分成 4 等份,返回 true;否则返回 false。
最后在主函数中调用 dfs 函数即可。
阅读全文