本人第一次寫部落格,如有不對,請多加指正。
解法一的思路很明顯是錯的。。。貪心演算法很多情況下求不出最佳解答,因為可能兩個陣列間需要同時交換兩個或者兩個以上的數,才能實現差值最小。如
解法二的思路將也就是乙個組合的問題在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 ...