1. 程式人生 > >將陣列分成兩部分使得兩部分的和的差最小

將陣列分成兩部分使得兩部分的和的差最小



題目有點拗口,舉個例子,有1,2,3一共3個數,將這三個數分成兩部分,有3種分法1 | 2,3或者1,2| 3 或者1,3|2,然後計算每部分所有數的和,
1 | 2,3 -> 和為1,5,和的差是4
1 2| 3 -> 和為3,3,和的差是0
1 3|2 -> 和為4,2,和的差是2
所以按照1,2| 3分得到的和的差最小。

那麼任意給定一個數組,如何找出最小值呢?

思路:差最小就是說兩部分的和最接近,而且和所有數的和SUM的一半也是最接近的。假設用sum1表示第一部分的和,sum2表示第二部分的和,SUM表示所有數的和,那麼sum1+sum2=SUM。假設sum1<sum2 那麼SUM/2-sum1 = sum2-SUM/2;
所以我們就有目標了,使得sum1<=SUM/2的條件下儘可能的大。也就是說從n個數中選出某些數,使得這些數的和儘可能的接近或者等於所有數的和的一般。這其實就是簡單的揹包問題了:
揹包容量是SUM/2. 每個物體的體積是數的大小,然後儘可能的裝滿揹包。
dp方程:f[i][V] = max(f[i-1][V-v[i]]+v[i], f[i-1][V] )
f[i][V]表示用前i個物體裝容量為V的揹包能夠裝下的最大值,f[i-1][V-v[i]]+v[i]表示第i個物體裝進揹包的情況,f[i-1][V]表示第i件物品不裝進揹包的情況。

按照dp方程不難寫出程式碼:
初始值:f[0][k]=0,f[i][0]=0;
for(i=0;i<n;i++)
    {
    for(j=1;j<SUM/2;j++)
     {   
        f[i][j]=f[i-1][j];
        if(v[i]<=j && f[i-1][j-v[i]]+v[i]>f[i][j]){
            f[i][j]=value[i-1][j-v[i]]+v[i];
        }
    
}


最終差值就是SUM-2*f[n-1][SUM/2];

相關推薦

陣列分成部分使得部分

題目有點拗口,舉個例子,有1,2,3一共3個數,將這三個數分成兩部分,有3種分法1 | 2,3或者1,2| 3 或者1,3|2,然後計算每部分所有數的和, 1 | 2,3 -> 和為1,5,和的差是4 1 2| 3 -> 和為3,3,和的差是0 1 3|2 -> 和為4,2,和的差是2 所

三種不同方法陣列分成奇數偶數陣列

//C方式編寫的函式,使用指標 #include <iostream> using namespace std; void printIntArr(const int arr[], int size) { for (int i = 0; i < si

給一個整數陣列,找到個數使得他們的等於一個給定的數 target(容易)

每個數跟後面的所有數進行相加比對,遇到相加等於target的新增到vector中直接返回即可/* 給一個整數陣列,找到兩個數使得他們的和等於一個給定的數 target。 你需要實現的函式twoSum需要返回這兩個數的

無序陣列O(n)時間找到排序後的個相鄰元素使得他們之間的

1、基數排序,然後根據排序後的陣列找到相差的最大值。 public int maximumGap(int[] nums) { if (nums == null || nums.length < 2) { return 0;

輸一個遞增排序的陣列一個數字 s,在陣列中查詢個數使得它們的 正好是 s

面試題:和為 s 的兩個數字 VS 和為 s 的連續正數序列 題目一:輸一個遞增排序的陣列和一個數字 s,在陣列中查詢兩個數使得它們的 和正好是 s。如果有多對數字的和等於 s,輸出任意一對即可。例如:輸入陣列 {1,2,4,7,11,15}和數字為 15.輸出 4 和 1

華為面試題(8分鐘寫出程式碼) 有陣列a,b,大小都為n,陣列元素的值任意,無序; 要求:通過交換a,b中的元素,使陣列a元素的陣列b元素的之間的

先上程式碼 java程式碼: public class MinDiff { public static void main(String[] args){ int[] aa={2,5,4,3,1,0}; int[] bb={7,9,8,10,6,11}

個有序陣列元素之積、K個值

題目來自阿里面試題目 題目 (1)已知A B兩個陣列,元素有序,構造新的集合S={x*y | x屬於A, y屬於B} 求S中最小的k個元素,最優解法。 (2)已知A B兩個陣列,元素有序,構造新的集合S={x+y | x屬於A, y屬於B} 求S中最小的k個元素,最

[微軟]有個序列a,b,大小都為n,序列元素的值任意整數,無序; 要求:通過交換a,b中的元素,使[序列a元素的]與[序列b元素的]之間的_利用排列組合思路解決_python版

+= 求和 ever tro 解決 turn 運行 main lis (原題出自微軟公司面試題)問題如下:有兩個序列a,b,大小都為n,序列元素的值任意整數,無序;要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。例如:a=[100,99,

Python 經典面試題: a,b個序列,大小都為n,序列元素的值任意整形數,無序, 要求: 通過交換a,b中的元素,使[序列a元素的]與[序列b元素的]之間的 使

方法: 用隨機數來求出結果 解題思想: 用隨機數隨機出來所有的程式碼排列可能性,在定義次數的時候 定義的次數越大得到的結果越準確. 最終程式碼: import random #有很多方法是把兩個列表合成一個後排序按照一大一小的分配生成兩個列表 #但是這樣是在資

32.交換使個序列

題目: 有兩個序列a,b,大小都為n,序列元素的值任意整數,無序;要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。例如:   var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40];求解思路:   

個序列a,b,大小都為n,序列元素的值任意整形數,無序; 要求:通過交換a,b中的元素,使[序列a元素的]與[序列b元素的]之間的

整體思想是利用兩個列表和的差值絕對值大小判斷是否互動兩個列表的值#!/usr/bin/env python# coding=utf-8def abs_test(a,b):    # 假設剛開始就是差值最小的    # 此時的差值絕對值為:    min = abs(sum(a

2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017) 部分題/平衡樹/環/思路bfs

交題地址 難度按照順序遞增 J - Judging Moose 隊友敲的 #include <iostream> #include <cstdio> using namespace std; int main() {

Python 求個 list 的交集

有時候,為了需求,需要統計兩個 list 之間的交集,並集,差集。查詢了一些資料,現在總結在下面: 1. 獲取兩個list 的交集 #方法一:a=[2,3,4,5]b=[2,5,8]tmp = [val for val in a if val in b]print

含有n個元素的整型陣列這個n個元素重新組合,求出的數,如{321,3,32},的數為 321323

優酷2014年筆試題 題目:含有n個元素的整型陣列,將這個n個元素重新組合,求出最小的數,如{321,3,32},最小的數為   321323下面的程式碼 複雜度為 o(n²);因為用了選擇排序 如果想進一步提高 可以快速排序(注意下面程式碼 交換時的if條件)證明:假設有

Q今天在上廁所時想到了這個問題:有n個數,組成二元組,的有多少對呢?大呢?

輸入描述: 輸入包含多組測試資料。 對於每組測試資料: N - 本組測試資料有n個數 a1,a2...an - 需要計算的資料 保證: 1<=N<=100000,0<=ai<=INT_MAX. 輸出描述: 對於每組

騰訊校招筆試——Q今天在上廁所時想到了這個問題:有n個數,組成二元組,的有多少對呢?大呢?

題目: 小Q今天在上廁所時想到了這個問題:有n個數,兩兩組成二元組,差最小的有多少對呢?差最大呢? 輸入描述: 輸入包含多組測試資料。 對於每組測試資料: N - 本組測試資料

演算法二十二:陣列之間

有兩個序列a,b,大小都為n,序列元素的值任意整數,無序; 要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。 例如:  var a=[100,99,98,1,2, 3]; var b=[1, 2, 3, 4,5,40]; 分析:要是序

【劍指offer{25-30}】複雜連結串列的複製、字串的排列、陣列中出現次數超過一半的數字、的K個數、連續子陣列

複雜連結串列的複製、字串的排列、陣列中出現次數超過一半的數字、最小的K個數、連續子陣列的最大和 複雜連結串列的複製 題目描述 輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節

連續子陣列

import java.util.Scanner; /** * @program: entrance_exam * @description: 計算連續子向量的最大和和乘積最小的連續子陣列(正數和負數)。 * 如{6,-3,-2,7,-15,1,2,2}的連續子向量的最

8、調整陣列使

8、調整陣列使差最小 Description 有兩個序列 a,b,大小都為 n,序列元素的值任意整數,無序; 要求:通過交換 a,b 中的元素,使[序列 a 元素的和]與[序列 b 元素的和]之間的差最小。 Input 輸入為兩行,分別為兩個陣列,每個值用空格隔開。 Outp