leetcode 416. 分割等和子集

先求出总和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];
}
}

浙公网安备 33010602011771号