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

2021-06-16 14:15:54 字數 1557 閱讀 6979

本人第一次寫部落格,如有不對,請多加指正。

解法一的思路很明顯是錯的。。。貪心演算法很多情況下求不出最佳解答,因為可能兩個陣列間需要同時交換兩個或者兩個以上的數,才能實現差值最小。如

解法二的思路將也就是乙個組合的問題在2n個陣列中找出n個數,使得n個數之和最接近於sum/2,(這裡取小於等於sum/2的情況),時間複雜度指數級。沒有按照書本上的思路,自己寫了組合**。

// test_combine.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include #include using namespace std;

const int maxsize = 8;

int a = ;

vectorvec;

int result = 0;

int totalsum = 0;

void combinenum(int num,int index)

if (sumv > result && sumv <= totalsum/2 )

return;

} if (index == maxsize)

vec.push_back(a[index]);

combinenum(num - 1,index + 1);

vec.pop_back();

combinenum(num,index + 1);

}void combine()

int _tmain(int argc, _tchar* argv)

combine();

cout << result << endl;

return 0;

}

思路三  個人感覺思路二和思路三的對比就像,斐波那契數列的遞迴和非遞迴一樣。將已完成的和存起來,供以後使用,來減少時間複雜度。

// test_sum.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

const int maxsize = 100;

int a = ;

bool dp[maxsize][maxsize]; //dp dp[i][v]表示是否能找到i個數,使得和為v;

void initdp()

} dp[0][0] = true;

}void caculate(int a,int size,int half_sum)

}} }

}int findresult(int a,int size)

} return max;

}int _tmain(int argc, _tchar* argv)

half_sum /= 2;

initdp();

caculate(a,sizeof(a)/sizeof(int),half_sum);

cout << findresult(a,sizeof(a)/sizeof(int));

return 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...

《程式設計之美》 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 ...