416. Partition Equal Subset Sum
解法一:深度优先搜索
class Solution {
public static boolean[] record;
public static int sum;
public static boolean canPartition(int[] nums) {
sum = 0;
record=new boolean[nums.length];
for (int num : nums) {
sum += num;
}
if (sum % 2 == 1) return false;
int target = sum/2;
Arrays.sort(nums);
if(dfs(nums, 0, target))
{
PrintOut(nums);
return true;
}
else
{
System.out.println("false");
return false;
}
}
public static void PrintOut(int[] nums)
{
StringBuilder sb1=new StringBuilder();
sb1.append("arr1:[");
StringBuilder sb2=new StringBuilder();
sb2.append("arr2:[");
for(int i=0;i<nums.length;i++)
{
if(record[i])
sb1.append(nums[i]+",");
else
sb2.append(String.valueOf(nums[i])+",");
}
String left=sb1.substring(0,sb1.length()-1)+("],");
String right=sb2.substring(0,sb2.length()-1)+"],sum="+String.valueOf(sum);
System.out.println(left+right);
}
public static boolean dfs(int[] nums, int pos, int target) {
if (target == 0) return true;
for (int i = pos; i < nums.length; ++i) {
if (i > pos && nums[i] == nums[i-1]) continue;
if (nums[i] > target) break;
if (dfs(nums, i+1, target-nums[i]))
{
record[i]=true;
return true;
}
}
return false;
}
}
解法二:0-1背包问题
0/1 Knapsack Dynamic problem
i is the the row index of dp matrix(the index of the items) and j is the column index of dp matrix(the remaining weight space of knapsack);
class Solution {
public boolean canPartition(int[] nums) {
int sum=0;
int n=nums.length;
for(int i=0;i<nums.length;i++)
{
sum+=nums[i];
}
if((sum&1)!=0)
return false;
int target=sum/2;
boolean[][] dp=new boolean[n+1][target+1];
dp[0][0]=true;
for(int i=1;i<=n;i++)
dp[i][0]=true;
for(int j=1;j<=target;j++)
dp[0][j]=false;;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=target;j++)
{
dp[i][j]=dp[i-1][j];
if(j-nums[i-1]>=0)
dp[i][j]=dp[i-1][j-nums[i-1]] || dp[i-1][j];
}
}
return dp[n][target];
}
}