LeetCode--416. Partition Equal Subset Sum

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);
i f ( j &lt; w e i g h t [ i ] ) T [ i ] [ j ] = T [ i 1 ] [ j ] e l s e : T [ i ] [ j ] = m a x ( T [ i ] [ j w e i g h t [ i ] ] + v a l u e [ i ] , T [ i 1 ] [ j ] ) if(j&lt;weight[i]) :T[i][j]=T[i-1][j]\\ else:T[i][j]=max(T[i][j-weight[i]]+value[i],T[i-1][j])

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];
    }
}

猜你喜欢

转载自blog.csdn.net/To_be_to_thought/article/details/89067753