動態規划(0-1背包)---划分數組為和相等的兩部分


划分數組為和相等的兩部分

416. Partition Equal Subset Sum (Medium)

題目描述:

  給定一個數組,判斷其是否可以被划分為相等的兩部分。

思路分析:

  我們可以換一種思路,判斷其是否可以分為相等的兩部分,其實就是看是否能在數組中挑選出和為數組和一半的序列。那么就可以轉化為背包問題,在N個數中挑選數字使其和為數組和的一半,狀態轉移方程為:

  dp[i]=dp[i] || dp[i-num]

代碼:

public boolean canPartition(int []nums){
    int sum=0;
    for(int num:nums){
        sum=sum+num;
    }
    if(sum%2!=0)
        return false;
    int target=sum/2;
    boolean []dp=new boolean [target+1];
    dp[0]=true;
    for(int num:nums){ //0-1背包一個物品只能用一次
        for(int i=target;i>=num;i--){ //從后向前,先計算dp[i],再計算dp[i-num]
            dp[i]=dp[i]||dp[i-num];
        }
    }
    return dp[target];
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM