思路:這個問題能夠轉化爲求數組的一個子集,使得這個子集中的元素的和儘量接近sum/2,其中sum爲數組中全部元素的和。這樣轉換以後這個問題就很相似0-1揹包問題了:在n件物品中找到m件物品,他們的能夠裝入揹包中,且總價值最大不過這裏不考慮價值,就考慮使得這些元素的和儘可能接近sum/2。html
下面列狀態方程:
dp[i][j]表示前i件物品中,總和最接近j的全部物品的總和,其中包括兩種狀況:數組
若是第i件物品沒有包括在其中,則dp[i][j] = dp[i-1][j]
若是第i件物品包括在其中,則dp[i][j] = dp[i-1][j-vec[i]]post
固然,這裏要確保j-vec[i] >= 0。學習
因此狀態轉移方程爲: url
dp[i][j] = max(dp[i-1][j],dp[i-1][j-vec[i]]+vec[i]);spa
for (int i = 1; i <= len; ++i) { for (int j = 1; j <= sum / 2; ++j) { if(j>=vec[i-1]) dp[i][j] = max(dp[i-1][j],dp[i-1][j-vec[i-1]]+vec[i-1]); else dp[i][j] = dp[i - 1][j]; } }
Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), …, (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible. 給出一個長度爲 2n 的整數數組,你的任務是將這些整數分紅n組,每組兩個一對,並求得 全部分組中較小的數 的總和(這個總和的值要儘量的大) Input: [1,4,3,2] Output: 4 Explanation: n is 2, and the maximum sum of pairs is 4. Note: n is a positive integer, which is in the range of [1, 10000]. All the integers in the array will be in the range of [-10000, 10000]. 思路:將整個數組升序排列,從下標爲 0 處開始,每隔兩個 取一個,並求和 class Solution(object): def arrayPartitionI(self, nums): return sum(sorted(nums)[::2])