1. 程式人生 > 其它 >leetcode-416. 分割等和子集

leetcode-416. 分割等和子集

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int n = nums.size();

        if(n<=1)  // 陣列長度小於等於1返回false
            return false;
            int sum = 0;
        for(int i = 0; i < n; i++)
            sum = sum + nums[i];
        int res = sum%2;
        
if(res==1) // 奇數返回false return false; int target = sum/2; sort(nums.begin(), nums.end()); if(nums[n-1]>target) // 最大值大於陣列和的一半,返回false return false; vector<vector<bool>> dp(n, vector<bool> (target+1, false)); //長度為target+1,和才能為target
//dp[i][j] 表示從陣列的 [0,i] 下標範圍內選取若干個正整數(可以是 0 個) //是否存在一種選取方案使得被選取的正整數的和等於 j for(int i = 0; i < n; i++) dp[i][0] = true; // 從0~i下標範圍內選擇若干個元素使得其和為0 肯定可以,不選嘛 dp[0][nums[0]] = true; // 從下標0選擇元素使其和為nums[0] 肯定可以,就選nums[0]; for(int i = 1; i < n; i++){ for(int j = 1
; j <= target; j++){ if(j>=nums[i]){ dp[i][j] = dp[i-1][j]||dp[i-1][j-nums[i]]; } else{ dp[i][j] = dp[i-1][j]; } } } return dp[n-1][target]; } };