數組分爲兩部分,使得其和相差最小

  • 題目:將一個數組分紅兩部分,不要求兩部分所包含的元素個數相等,要求使得這兩個部分的和的差值最小。好比對於數組{1,0,1,7,2,4},能夠分紅{1,0,1,2,4}和{7},使得這兩部分的差值最小。

思路:這個問題能夠轉化爲求數組的一個子集,使得這個子集中的元素的和儘量接近sum/2,其中sum爲數組中全部元素的和。這樣轉換以後這個問題就很相似0-1揹包問題了:在n件物品中找到m件物品,他們的能夠裝入揹包中,且總價值最大不過這裏不考慮價值,就考慮使得這些元素的和儘可能接近sum/2。html

下面列狀態方程: 
dp[i][j]表示前i件物品中,總和最接近j的全部物品的總和,其中包括兩種狀況:數組

  1. 第i件物品沒有包括在其中
  2. 第i件物品包括在其中

若是第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];  
        }  
    }  

將1~n個整數按字典順序進行排序,返回排序後第m個元素.net

 字典序(今日頭條2017秋招真題)code

  • Leetcode學習—— Array Partition I

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])
相關文章
相關標籤/搜索