題目概述:有乙個沒有排序,元素個數為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這個區間中的哪些值可以被計算出來。
#include int min(int a,int b)
int halfsame(int array,int n,int sum)
}int main()
; num=sizeof(str)/sizeof(int);
for(i=0;i
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的時候,只有乙個正整數可以被選取,...
《程式設計之美》 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...