416. 分割等和子集

package leetcode;

public class demo_416 {
    public boolean canPartition(int[] nums) {
        int sum=0;
        for (int i : nums) {
            sum=sum+i;
        }
        //全部元素和为偶数,则不存在
        if(sum%2!=0) {return false;}
        int target=sum/2;
        int[] dp=new int[target+1];
        dp[0]=1;
        //01背包,找出和为target的子数组的个数
        for (int i = 0; i < nums.length; i++) {
            for(int j=target;j>=nums[i];j--) {
                dp[j]=dp[j]+dp[j-nums[i]];
            }
        }
        //如果个数不为0,则一定存在
        if(dp[target]!=0) {return true;}
        return false;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        demo_416 demo=new demo_416();
        int[] nums= {1,5,11,5};
        System.out.println(demo.canPartition(nums));
    }

}

 

posted on 2022-04-28 09:48  一仟零一夜丶  阅读(17)  评论(0)    收藏  举报