問題:
有乙個沒有排序,有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...