zoukankan      html  css  js  c++  java
  • 编程之美-2.18 数组分割

    对这篇博客,自己实现其中的第一种解法如下:

    def array_split(arr):
        half_sum = sum(arr) // 2  # 只找不大于sum/2的和
        dp = [[] for _ in range(len(arr) + 1)]  # dp[len(arr)][len(arr)//2][half_sum]
        for i in range(len(arr) + 1):
            for j in range(len(arr) // 2 + 1):
                row = [False for k in range(half_sum + 1)]
                dp[i].append(row)
        # print(len(dp),len(dp[0]),len(dp[0][0])) # for debug
        for i in range(1, len(arr) + 1):
            j_max = min(i, len(arr) // 2)
            for j in range(0, j_max + 1):
                for s in range(half_sum + 1):
                    if i == 1:
                        if j == 0:
                            dp[i][j][0] = True
                        if j == 1:
                            dp[i][j][arr[i-1]] = True
                            smaller_sum = arr[i-1]
                    else:
                        if j <= i - 1:
                            if dp[i-1][j][s] == True:
                                dp[i][j][s] = True
                                smaller_sum = s
    
                        if s >= arr[i-1] and dp[i - 1][j - 1][s - arr[i-1]] == True:
                            dp[i][j][s] = True
                            smaller_sum = s
    
        smaller_arr = []
        i = len(arr)
        j = len(arr) // 2
        curr_sum = smaller_sum
        while i > 0 and j > 0:
            if dp[i - 1][j - 1][curr_sum - arr[i-1]] == True:
                smaller_arr.append(arr[i-1])
                j -= 1
                curr_sum -= arr[i-1]
            else:
                i -= 1
        return smaller_arr[::-1]
    
    if __name__ == '__main__':
        arr = [2,3,3,6]
        res = array_split(arr)
        print(res)
    
    
    

    这篇博客中提出了另一个不同于动态规划的O(NlogN)的解法,不过缺点就是不能保证分成的两个数组的长度相等。

  • 相关阅读:
    JobTracker作业启动过程分析
    结构体传参
    getchar()
    char *a与char a[n]的区别
    EOF NULL 之间的区别
    现代方法第15章第三节的程序
    交换机console口连接
    undefined reference问题总结
    二维数组与指针
    数组作为参数传递的时候,被调用的函数内无法计算出数组的大小
  • 原文地址:https://www.cnblogs.com/ZeroTensor/p/10825362.html
Copyright © 2011-2022 走看看