正整数分组【动态规划】

题目来源:http://www.51nod.com/Challenge/Problem.html#!#problemId=1007html

思路:要求两组之差最小的分组方法,必然有其中一组的和最接近但小于sum/2,这样就能够转化为0/1背包问题求解:价值和重量都是a[i]的大小。app

AC代码:spa

def solve(a):
    s = sum(a)
    dp = [0 for i in range(s)]

    for i in range(a.__len__()):
        for j in range(s // 2, a[i] - 1, - 1):
            dp[j] = max(dp[j - a[i]] + a[i], dp[j])
    return abs(s - dp[s // 2] - dp[s // 2])


if __name__ == '__main__':
    n = int(input())
    a = []
    for i in range(n):
        a.append(int(input()))
    print(solve(a))

参考:http://www.javashuo.com/article/p-sysmeddh-cp.htmlcode

   http://www.javashuo.com/article/p-sysmeddh-cp.htmlhtm

相关文章
相关标签/搜索