leetcode 416:分割等和子集

leetcode 416:分割等和子集


题目描述:
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].

解题步骤:需要所选则子集之和等于总和一半即可。
1、 状态定义:dp[i][j]表示从数组的 [0, i] 这个子区间内挑选一些正整数,每个数只能用一次,使得这些数的和恰好等于 j,其值为true或者false。
2、 状态转移方程
在这里插入图片描述
3、 初始化:dp[0][0] = false,因为是正整数,当然凑不出和为 0。
4、 输出:dp[nums.length][bagv],这里 nums.length表示数组的长度,bagv是数组的元素之和(必须是偶数)的一半。
代码

    public boolean canPartition(int[] nums) {
    	//nums[]为每个物品的容积,其价值全为0
    	//计算出总容积
    	int bagv = 0;
    	for (int i = 0; i < nums.length; i++) {
			bagv += nums[i];
		}
    	if(bagv%2!=0)
    		return false;
    	bagv /= 2;
    	boolean[][] dp = new boolean[nums.length][bagv+1];
    	for (int i = 1; i < nums.length; i++) {
			for (int j = 1; j <= bagv; j++) {
				if(j==nums[i])
					dp[i][j] =  true;
				else if(j < nums[i]) {
					dp[i][j] = dp[i-1][j];
				}
				else {
					dp[i][j] = dp[i-1][j]||dp[i-1][j-nums[i]];
				}
			}
		}
    	return dp[nums.length-1][bagv];
    }
发布了28 篇原创文章 · 获赞 0 · 访问量 260

猜你喜欢

转载自blog.csdn.net/zy450271923/article/details/105300644