leetcode 416. 分割等和子集

image

先求出总和sum,要求出是否存在子集,使得子集和为sum/2。
本题看做一个0-1背包问题:物品的重量和价值就是元素值,背包总承重是sum/2,可以求出背包能放下的最大价值,如果该值正好等于sum/2,说明正好装满

class Solution {
    public boolean canPartition(int[] nums) {
        int sum=0;
        for(int num:nums) sum+=num;
        return sum%2==0&&solveKnapsack(nums,sum/2)==sum/2;
    }

    int solveKnapsack(int[] weight,int bagWeight){
        int n=weight.length;
        int[] dp=new int[bagWeight+1];
        for(int i=0;i<n;i++){
            for(int j=bagWeight;j>=weight[i];j--){
                dp[j]=Math.max(dp[j],dp[j-weight[i]]+weight[i]);
            }
        }
        return dp[bagWeight];
    }
}
posted @ 2022-02-23 12:08  livingsu  阅读(27)  评论(0)    收藏  举报