/** * Created by haoge-pc on 2017/10/17. * 一个非空,全正的整数数组,判断能否划分成两个和相等的子数组 */ public class Q416PartitionEqualSubsetSum { public boolean canPartition(int[] nums) { int sum = 0; for (int num : nums) { sum += num; } if (sum%2 != 0) return false; sum /= 2; Boolean[] dp = new Boolean[sum+1]; Arrays.fill(dp,false); dp[0] = true; //遍历从sum到0的每个整数,看是否能由数组中的数组成 //判断的方式是看i-num是否是true,是的话由于当前有num,所以i可以拼成 //把num都要检查一遍,所以复杂度是o(sum * n) for (int num: nums) { for (int i = sum; i >= 0; i--) { //两种情况说明这个i可以拼成:一种是在前边的检查中已经验证可以拼成了,另一种是这次才验证了可以拼成 dp[i] = dp[i] || dp[i-num]; } } return dp[sum]; } }
这个题最重要的一个方法:一个数组判断能不能相加凑出来一个数sum
方法是:判断sum到0的每个整数是否能被拼凑出来
对于每个数组中的数num都进行一次从sum到num的判断
设置一个动态规划的数组,dp[i]记录i能否被凑出来,dp[i] = dp[i] || dp[i-num]
|| 前边你的若是ture则代表这个已经被验证了可以,后边的true说明可以i-num可以,加上本次的数是num,所以i也可以被拼出来