LintCode-划分和相等的子集-动态规划

描述

给一 只含有正整数 的 非空 数组, 找到这个数组是否可以划分为 两个 元素和相等的子集。

所有数组元素不超过100.
数组大小不超过200.

样例

给一数组 [1, 5, 11, 5] , 返回 true ,
两个子集:[1, 5, 5], [11]
给一数组 [1, 2, 3, 9] , 返回 false

代码

class Solution:
    """
    @param nums: a non-empty array only positive integers
    @return: true if can partition or false
    """
    def canPartition(self, nums):
        # write your code here
        sumNums = sum(nums)
        n = len(nums)
        if sumNums%2 != 0:
            return False
        m = sumNums//2
        dp = [[False for j in range(m+1)] for i in range(n+1)]
        for i in range(n+1):
            dp[i][0] = True
        for i in range(1, n+1):
            for j in range(1, m+1):
                if j<nums[i-1]:
                    dp[i][j] = dp[i-1][j]
                else:
                    dp[i][j] = dp[i-1][j] | dp[i-1][j-nums[i-1]]
        return dp[n][m]

思路

简要而言,就是01背包问题的变种。首先,数组总和是奇数,肯定是返回False的。然后,数组是偶数和的情况下,两个子序列和相等,也就是说,需要我们找出其中一个子序列,它的和应该为数组总和的一半,如果这个子序列存在,那么数组中剩下的数就可以组成另一个子序列,其和必定也是数组总和的一半。所以问题就转化了为01背包问题了,找到“体积”为数组中数字大小的石头能刚好填满“体积”为数组总和一半的背包,如果找到了,就返回True,否则,False。

题目来源

https://www.lintcode.com/problem/partition-equal-subset-sum/description

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 2018年的暑假课结束之后,我回到了老家,3个小时的高铁,516块,这已经是很便捷很便宜的交通方式了,从合肥到老家...
    ALsoon阅读 1,657评论 0 0
  • 【一】 “我叫张暖涵。现毕业于xx大学……” 一位女子端坐在椅子上,面前是几位表情十分严肃的面试官。 而...
    东京下雨_漫过巴黎阅读 1,841评论 0 0
  • 前些日子,一位小学妹向我咨询春季毕业找工作的事。从单位开车回家,我心里感叹,当年自己研究生毕业准备找工作的时候,内...
    曾哥学英语阅读 14,253评论 1 3
  • 简历的艺术 毕业季临近,很多人都因为需要工作的原因而开始头疼,原因有很多,大部分人的原因是因为简历的问题。 怎么写...
    Lzer0阅读 1,810评论 0 0
  • 看到一个小妹妹很帅地滑轮滑,小鱼同学也想要一双轮滑鞋,两只小手捧在一起央求妈妈:“妈妈,我好想也有双轮滑鞋...
    临之以庄阅读 3,427评论 0 0

友情链接更多精彩内容