给你一个 只包含正整数 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

    分析:这道题是0-1背包问题,每个元素只可以用一次,用0-1背包问题去思考的话,物品的价值与重量均为nums[i],而背包容量为数组总和的一半;

    第一步:dp[i]指什么? 答:dp[i]指背包容量为i时,物品的最大价值,这道题中就是指最大总和为i时,只使用数组元素最大总和为多少。
    第二步:如何推导?答:套用0-1背包公式,dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]);比较不加当前物品与加入当前物品的最大值
    第三步:初值?答:在本题中,初值均为0即可,或是不用设置,即可为0;

    参考代码:
    public boolean canPartition(int[] nums) {
    int sum=0;
    for(int i:nums){
    sum+=i;
    }
    if(sum%2==1) return false;
    int target=sum/2;
    int[] dp = new int[target+1];
    for(int i=0;i for(int j=target;j>=nums[i];j—){
    dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]);
    }
    }
    return dp[target]==target;
    }