参考了http://blog.csdn.net/mebiuw/article/details/52765840的解题方法
AC代码:
class Solution(object): def canPartition(self, nums): """ :type nums: List[int] :rtype: bool """ list = [0,nums[0]] sum = 0 for i in range(len(nums)): sum += nums[i] print sum if sum%2 ==1: return False else: sum = sum/2 dp = [[0 for i in range(sum+1)] for j in range(len(nums))] for i in range(nums[0],sum+1): dp[0][i] = nums[0] for i in range(1,len(nums)): for j in range(nums[i],sum+1): dp[i][j] = max(dp[i-1][j],dp[i-1][j-nums[i]]+nums[i]) if dp[len(nums)-1][sum] != sum: return False else: return True解题思想:使用动态规划的思想,dp[i][j]表示的是在背包中装前件物品,且容量为j的情况下,能装的最大物品数量。只装第0件物品时,当容量大于第0件物品的重量,最多装的物品容量正是该物品本身。装前i件物品且容量为j时,对前i-1件物品的最大容量去掉第i件物品后再作比较。最终,比较当取前n-1件物品,且最大容量为sum的一半时,最大能否取到sum一半数量的物品,如果可以,则有解。