將乙個陣列劃分為和差值最小的子陣列

2021-07-10 14:16:54 字數 736 閱讀 8297

思路:很容易知道如果選取的某個子陣列的和currentsum=sum/2,則這兩個子陣列的和的差值最小,即從陣列中選取某些數字使得其和接近整個陣列的1/2.,所以該命題本質上是乙個01揹包命題,原命題等價於從n各物品中選取若干個,其重量不超過sum/2,且重量達到最大

基於上述思路**如下:

#include using namespace std;

const int m = 100;

int w[m];

int currentsum[m*m];

bool state[m][m];

int main()

memset(currentsum, 0, sizeof(currentsum));

memset(state, 0, sizeof(state));

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

for (int j = sum/2; j >= w[i]; --j)

}printf("%d\n", sum - currentsum[sum/2]*2);

int i = n, j = sum/2;

while (i--)

}printf("\n");

} return 0;

}

程式執行結果如下:

將乙個整數劃分為多個正整數之和

整數劃分問題是將乙個正整數n拆分成一組數連加並等於n的形式,顯然這組數中最大加數不大於n。令n為需要劃分的整數,m為劃分後的最大整數。例如將6劃分為最大加數為6的劃分形式如下 5 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 2 2,2 2 1 1,2 1 1 1 1 1 1 1 ...

通過shell將乙個檔案劃分為多個檔案

原始檔名為test.xt,檔案內容如下 sort a 3 4 sort a 2 5 sort b 1 2 sort b 2 5 分割後的檔案 file1 sort a 3 4 sort a 2 5 file2 sort b 1 2 sort b 2 5 這個其實很簡單,就是遍歷每一行的時候,在把該行...

將乙個整數劃分為多個正整數之和

整數劃分問題是將乙個正整數n拆分成一組數連加並等於n的形式,顯然這組數中最大加數不大於n。令n為需要劃分的整數,m為劃分後的最大整數。例如將6劃分為最大加數為6的劃分形式如下 65 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 2 2,2 2 1 1,2 1 1 1 1 1 1 1...