题目链接:LeeCode416分割等和子集
题目描述:
首先看要求,判断是否能分成两个和相等的子集,于是我就想求出整个和的一半,然后搜索判断是不是能拼出来这样的结果,然后时间超限了。
然后就开始思考动态规划,把这个题看成0-1背包问题,当容量是整个和一半的时候能获得的价值也是和一半代表拼出来了,返回true
class Solution {
public static boolean canPartition(int[] nums) {
int[] dp=new int[20000];
int sum=0;
boolean flag=false;
int[] book=new int[nums.length];
//求整个和
for (int i = 0; i < nums.length; i++) {
sum+=nums[i];
}
if(sum%2!=0)return flag;
//和的一半
sum=sum/2;
//0-1背包
for (int i = 0; i < nums.length; i++) {
for (int j = sum; j >= nums[i]; j--) {
dp[j]=Math.max(dp[j-nums[i]]+nums[i],dp[j]);
//当容量是整个和一半的时候能获得的价值也是和一半代表拼出来了返回true
if(dp[j]==sum)flag=true;
}
}
return flag;
}
}