程式設計之美 陣列分割

2021-07-14 08:02:50 字數 1788 閱讀 4095

問題:

有乙個沒有排序,有2n個元素的陣列,要求把這個陣列分為兩部分,分別含有n個元素,並使兩個子陣列的和最接近。

這裡的程式主要是計算這個和的值。

比如陣列 ,計算後符合的分法是 和算出比較小的就可以了是  110

例如陣列  分開後是 和

思考方法:

動態規劃

1)  計算出陣列中所有元素的和,並把它除以2,這樣得到了目標值。

2)  但目標值不一定是能達到的,比如 陣列  目標值是 1111/2=555,但最後的分解結果只能是 110 和 1001。

演算法會嘗試從1到目標值,檢查是否他們每乙個是否可以被陣列元素組合出來,從而找到最接近目標值的和,找到最優解。

fun_1 和 fun_2

這種演算法的缺點是如果和很大效率就不高了,尤其當和很大,但陣列中元素的個數又比較少的時候,用起來就不是很適合了。

#include #include using namespace std;

int getsum(int* arr, int len, int start)

return sum;

}int min(int a, int b)

int max(int a, int b)

void print_bool_arr(bool** arr, int x, int y)

cout << endl;

}cout << endl << endl;

}void print_int_arr(int** arr, int x, int y)

cout << endl;

}cout << endl << endl;

}int fun_1(int* arr, int n)

isok[0][0] = true;

print_bool_arr(isok, 2*n+1, sum/2+2);

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

print_bool_arr(isok, 2*n+1, sum/2+2);}}

s = 0;

for (s = sum/2+1; s >= 0; --s)

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

delete isok;

isok = null;

return s;

}int fun_2(int *arr, int n)

print_int_arr(result, n*2+1, sum/2+2);

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

else}}

print_int_arr(result, n*2+1, sum/2+2);}}

s = 0;

for (s = sum/2+1; s >= 0; --s)

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

delete result;

result = null;

return s;

}void main()

; //int test = ;

//int test = ;

int test = ;

//int test = ;

int len = sizeof(test)/sizeof(test[0]);

fun_1(test, (len-1)/2);

//fun_2(test, (len-1)/2);

cin >> i;

}

程式設計之美 陣列分割

問題1 有乙個無序 元素個數為n的正整數陣列,要求 如何能把這個陣列分割為兩個子陣列,子陣列的元素個數不限,並使兩個子陣列之和最接近。解答 int sum 0 for i 0 i0 j 從最大的開始遍歷,是為了防止同乙個數選取多次 for j sum 2 j if dp j break return...

程式設計之美 陣列分割

程式設計之美 陣列分割 和擴充套件 將乙個陣列劃分成兩個子陣列,要求他們的和最接近 1.長度要求相等的情況 2.長度沒有要求的情況 都能用動態規劃解決 include includeusing namespace std void arraysplit1 int a,int n 兩個子陣列長度要求相...

程式設計之美 陣列分割

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