【华为OD机试真题】等和子数组最小和

题目描述

给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。

输入描述

第一行输入 m

接着输入m个数,表示此数组nums

数据范围:1<=m<=50, 1<=nums[i]<=50

输出描述

最小拆分数组和

测试样例1

输入

7
4 3 2 3 5 2 1

输出

5

说明

可以等分的情况有:

4 个子集(5),(1,4),(2,3),(2,3)

2 个子集(5, 1, 4),(2,3, 2,3)

但最小的为5。

Python代码解析

def min_group_sum(nums):
    total = sum(nums)
    min_sum = 50 * 50 + 1

    def backtrack(index, m, sum, num_groups, total_sum):
        nonlocal min_sum
        if sum == target:
            total_sum += sum
            if total_sum == target * num_groups:
                if sum < min_sum:
                    min_sum = sum
            else:
                backtrack(0, m, 0, num_groups - 1, total_sum)
        else:
            for i in range(index, m):
                if sum + nums[i] <= target:
                    temp = nums[i]
                    nums[i] = -1
                    backtrack(i + 1, m, sum + temp, num_groups, total_sum)
                    nums[i] = temp

    nums.sort(reverse=True)
    m = len(nums)
    for num_groups in range(1, m + 1):
        if total % num_groups == 0:
            target = total // num_groups
            backtrack(0, m, 0, num_groups, 0)

    return min_sum


if __name__ == "__main__":
    nums = [4, 3, 2, 3, 5, 2, 1]
    print(min_group_sum(nums))

参考

https://wiki.amoscloud.com/zh/ProgramingPractice/NowCoder/Adecco/Topic0236

#华为OD##华为OD机考##华为OD机试真题##华为OD机试算法题库##华为OD题库#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务