416. Partition Equal Subset Sum
动态规划公式:dp[j]=dp[j] || dp[j-nums[i]]
class Solution {
public boolean canPartition(int[] nums) {
if(nums.length==0)
return false;
int sum=0;
for(int i=0;i<=nums.length-1;i++)
sum+=nums[i];
if(sum%2==1)
return false;
sum/=2;
boolean dp[]=new boolean[sum+1];
dp[0]=true;
for(int i=0;i<=nums.length-1;i++)
for(int j=sum;j>=nums[i];j--)
dp[j]=dp[j]|| dp[j-nums[i]];
return dp[sum];
}
}
这个题目与上面题目相比,需要自己转换成上面的形式,同时需要注意边界条件的设置。
class Solution {
public int findTargetSumWays(int[] nums, int S) {
int sum=0;
for(int i=0;i<=nums.length-1;i++)
sum+=nums[i];
int target=(S+sum)/2;
if((S+sum)%2==1 || sum<S)
return 0;
int dp[]=new int[target+1];
dp[0]=1;
for(int i=0;i<=nums.length-1;i++){
for(int j=target;j>=nums[i];j--){
dp[j]=dp[j]+dp[j-nums[i]];
}
}
return dp[target];
}
}