1. 程式人生 > >416. Partition Equal Subset Sum子陣列和問題

416. Partition Equal Subset Sum子陣列和問題

相同子集和分割。

問題:

Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

Note:
Both the array size and each of the array element will not exceed 100.

Example 1:

Input: [1, 5, 11, 5]

Output: true

Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:

Input: [1, 2, 3, 5]

Output: false

Explanation: The array cannot be partitioned into equal sum subsets.
 
以下內容參見:

http://www.cnblogs.com/grandyang/p/5951422.html


這道題給了我們一個數組,問我們這個陣列能不能分成兩個非空子集合,使得兩個子集合的元素之和相同。那麼我們想,原陣列所有數字和一定是偶數,不然根本無法拆成兩個和相同的子集合,那麼我們只需要算出原陣列的數字之和,然後除以2,就是我們的target,那麼問題就轉換為能不能找到一個非空子集合,使得其數字之和為target。開始我想的是遍歷所有子集合,算和,但是這種方法無法通過OJ的大資料集合。於是乎,動態規劃DP就是我們的不二之選。我們定義一個一維的dp陣列,其中dp[i]表示數字i是否是原陣列的任意個子集合之和,那麼我們我們最後只需要返回dp[target]就行了。我們初始化dp[0]為true,由於題目中限制了所有數字為正數,那麼我們就不用擔心會出現和為0或者負數的情況。那麼關鍵問題就是要找出遞迴公式了,我們需要遍歷原陣列中的數字,對於遍歷到的每個數字nums[i],我們需要更新我們的dp陣列,要更新[nums[i], target]之間的值,那麼對於這個區間中的任意一個數字j,如果dp[j - nums[j]]為true的話,那麼dp[j]就一定為true

,於是地推公式如下:


dp[j] = dp[j] || dp[j - nums[i]]         (nums[i] <= j <= target,要倒序來算)

例如:1  5  3

              index:   0   1   2   3   4   5   6   7   8   9

     加入1時{1}:   1    1                                              {1}時,得到2個不同的和

   加入5時{1,5}:  1    1                 1   1                       來了5之後,在原來的基礎上,多了5和6,共4個不同的和

加入3時{1,5,3}:  1    1        1   1   1   1       1   1         加入3之後,由原來的4個和變成8個和。

這個dp過程是:{1} -> {1,5} -> {1,5,3} ,每次計算,我們都要利用前一個狀態的計算結果(例如,計算{1,5,3}時,需要用到{1,5}的結果,而{1,5}的結果已經計算好並儲存在dp[target+1]中),這正是dp中關鍵的思想。


有了遞推公式,那麼我們就可以寫出程式碼如下:
//dp
bool canPartition(int* nums, int numsSize) {
    int sum = 0, ret;
    for(int i = 0; i < numsSize; ++i) sum += nums[i];
    if(sum%2) return false;
    int target = sum/2;
    bool* dp = (bool*)malloc((target+1)*sizeof(bool));
    memset(dp, 0, (target+1)*sizeof(bool));
    dp[0] = 1;
    for(int i = 0; i < numsSize; ++i)
        for(int j = target; j >= nums[i]; --j)
            dp[j] = dp[j]|dp[j-nums[i]];
    ret = dp[target];
    free(dp);
    return ret;
}



相關推薦

416. Partition Equal Subset Sum陣列問題

相同子集和分割。 問題: Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that

(Java) LeetCode 416. Partition Equal Subset Sum —— 分割等子集

工作 href ... 發現 地方 而是 subset emp solution Given a non-empty array containing only positive integers, find if the array can be partitioned

LN : leetcode 416 Partition Equal Subset Sum

con not 表數 tco -- 我們 tro -m accepted lc 416 Partition Equal Subset Sum 416 Partition Equal Subset Sum Given a non-empty array containing

416. Partition Equal Subset Sum

leetcode als clas result put for gin true ise https://leetcode.com/problems/partition-equal-subset-sum/description/ class Solution { pub

python leetcode 416. Partition Equal Subset Sum

每個數都可以取或不取,用字典儲存已經嘗試過的和 class Solution: def canPartition(self, nums): """ :type nums: List[int] :rtype: bool

LeetCode:416. Partition Equal Subset Sum(判斷一個數組時候可以平均分為兩半)

Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both

Leetcode題解系列——416. Partition Equal Subset Sum(c++版)

題目連結:416. Partition Equal Subset Sum 題目大意:題目給出一個數組,分割成兩個集合,判斷這兩個集合的和相等。 一.演算法設計 這是一道經典的動態規劃問題,判斷子集合的和是否相等,由於集合的組成需要指數的構造時間,不符合題目要求的時間複雜度。這

[leetcode]416. Partition Equal Subset Sum

[leetcode]416. Partition Equal Subset Sum Analysis 完了完了 真的要找不到工作了!!!!!蒼了天了!!!—— [每天刷題並不難0.0] Given a non-empty array containing on

[LeetCode] Partition Equal Subset Sum 相同子集分割

Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both su

Partition Equal Subset Sum 分割等子集

給定一個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意:每個陣列中的元素不會超過 100陣列的大小不會超過 200示例 1:輸入: [1, 5, 11, 5] 輸出: true 解釋: 陣列可以分割成 [1, 5, 5] 和 [1

Leetcode 416. Partition Equal Subset Sum 對半分 解題報告【修正版】

1 解題思路 leetcode才出來的時候,測試用例比較簡單,所以我之前用的是暴力法,而且AC了,後面有人和我說沒法通過了,所以後面我重新做了下,[並且參照了他的思路(](http://blog.csdn.net/liuyue910828/article/de

LeetCode 416. 分割等子集 Partition Equal Subset Sum

9-7 面試中的0-1揹包問題 Partition Equal Subset Sum 題目: LeetCode 416. 分割等和子集 給定一個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。 注意: 每個陣列中的元素不會超過 100

LeetCode416. Partition Equal Subset Sum

416. Partition Equal Subset Sum Given a non-empty array containing only positive integers, find if the array can be partitione

[leetcode]523. Continuous Subarray Sum連續陣列(為K的倍數)

Given a list of non-negative numbers and a target integer k, write a function to check if the array has a continuous subarray of size a

[LeetCode] Subarray Sum Equals K 陣列為K

Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k. Example 1: Input:nums = [

最接近零的陣列

前言 本解法轉載自九章演算法 九章演算法官網 http://www.jiuzhang.com/?source=code 原題地址 http://www.lintcode.com/problem/subarray-sum-closest/ 原答案地址 http://www.

求一個二維陣列所有陣列的最大值(郭少周,陳澤)

小組成員:陳澤 郭少周 設計流程:     設計要求.:1. 輸入一個二維整形陣列,數組裡有正數也有負數。                     2.二維陣列中連續的

返回一個二維整數陣列中的最大的陣列

一。題目:                   1、輸入一個二維整形陣列,數組裡有正數有負數。                 &nbs

53 最大連續陣列

給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 

LintCode139 最接近零的陣列

Subarray Sum Closest Given an integer array, find a subarray with sum closest to zero. Return the indexes of the first number and last number.