《程式設計之美》 2 18 陣列分割

2021-05-23 09:08:49 字數 801 閱讀 7800

題目概述:有乙個沒有排序,元素個數為2n的正整數陣列。要求把它分割為元素個數為n的兩個陣列,並使兩個子陣列的和最接近。

假設陣列a[1..2n]所有元素的和是sum。模仿動態規劃解0-1揹包問題的策略,令s(k, i)表示前k個元素中任意i個元素的和的集合。顯然:

s(k, 1) =

s(k, k) =

s(k, i) = s(k-1, i) u

按照這個遞推公式來計算,最後找出集合s(2n, n)中與sum最接近的那個和,這便是答案。這個演算法的時間複雜度是o(22n).

因為這個過程中只關注和不大於sum/2的那個子陣列的和。所以集合中重複的和以及大於sum/2的和都是沒有意義的。把這些沒有意義的和剔除掉,剩下的有意義的和的個數最多就是sum/2個。所以,我們不需要記錄s(2n,n)中都有哪些和,只需要從sum/2到1遍歷一次,逐個詢問這個值是不是在s(2n,n)中出現,第乙個出現的值就是答案。我們的程式不需要按照上述遞推公式計算每個集合,只需要為每個集合設乙個標誌陣列,標記sum/2到1這個區間中的哪些值可以被計算出來。關鍵**如下:

for(i = 0; i < n+1; i++)     

for(j = 0; j < sum/2+1; j++)     

flag[i][j] = false;     

flag[0][0] = true;     

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

}     

}     

for(i = sum/2; i >= 0; i--)      

}  

程式設計之美 2 18 陣列分割

本人第一次寫部落格,如有不對,請多加指正。解法一的思路很明顯是錯的。貪心演算法很多情況下求不出最佳解答,因為可能兩個陣列間需要同時交換兩個或者兩個以上的數,才能實現差值最小。如 解法二的思路將也就是乙個組合的問題在2n個陣列中找出n個數,使得n個數之和最接近於sum 2,這裡取小於等於sum 2的情...

《程式設計之美》 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 陣列分割

1.簡述 有乙個無序 元素個數為2n的正整數陣列,要求 如何能把這個陣列分割為元素個數為n的兩個陣列,並使兩個子陣列的和最接近?例如有如下陣列,1,5,7,8,9,6,3,11,20,17。應該分割為1,3,11,8,20和5,7,9,6,17。2.思路 方法一,暴力搜尋,遍歷每種分組方法,一共c ...