陣列分割問題

2022-02-02 19:18:30 字數 926 閱讀 2649

昨天同學問我一道關於陣列分割的問題——有乙個無序、元素個數為2n的正整數陣列,要求:如何能把這個陣列分割為元素個數為n的兩個陣列,並是兩個子陣列的和最接近。

假設2n個整數之和為sum。從2n個整數中找出n個元素的和,有三種可能:大於sum/2,等於sum/2,小於sum/2。可以考慮小於等於sum/2的情況。使用動態規劃解決這個問題,其實這是乙個np問題,只能盡量去接近sum/2這個值。

我們可以定義dp[k][s]代表從前k個數中去任意個元素,且k小於等於n,其和為s是否存在;之所以將選出的數之和放在下標中,而不是作為dp[k]的值,是因為那種做法不滿足動態規劃的前提——最優化原理。

#include #include 

using

namespace

std;

const

int maxn = 100

;const

int maxsum = 100000

;bool

dp[maxn][maxsum];

inta[maxn];

intmain()

int sum = 0

;

for(i = 1; i <= 2*n; i++)

sum +=a[i];

memset(dp,

false, sizeof

(dp));

dp[0][0] = true

;

for(k = 1; k <= 2*n; k++)}}

for(s = sum/2; s >= 1 && !dp[n][s]; s--);

cout

<< "

s1 =

"<< s << ";"

<< "

s2 =

"<< sum - s

}

2 18 陣列分割

題目概述 有乙個沒有排序,元素個數為2n的正整數陣列。要求把它分割為元素個數為n的兩個陣列,並使兩個子陣列的和最接近。假設陣列a 1.2n 所有元素的和是sum。模仿動態規劃解0 1揹包問題的策略,令s k,i 表示前k個元素中任意i個元素的和的集合。顯然 s k,1 s k,k s k,i s k...

2 18 陣列分割

問題 有乙個沒有排序,元素個數為2n的正整數陣列。要求把它分割為元素個數為n的兩個陣列,並使兩個子陣列的和最接近。解法 假設陣列a 1.2n 所有元素的和是sum。模仿動態規劃解0 1揹包問題的策略,令s k,i 表示前k個元素中任意i個元素的和的集合。顯然 s k,1 s k,k s k,i s ...

2 18 陣列分割

解法 2.18 陣列分割 class test 初始狀態 boolean dp i j false for all i all j dp i 0 true for all i 表示不選取任何整數,則被選取的整數的和為0 dp 0 nums 0 true 表示當i 0的時候,只有乙個正整數可以被選取,...