昨天同學問我一道關於陣列分割的問題——有乙個無序、元素個數為2n的正整數陣列,要求:如何能把這個陣列分割為元素個數為n的兩個陣列,並是兩個子陣列的和最接近。
假設2n個整數之和為sum。從2n個整數中找出n個元素的和,有三種可能:大於sum/2,等於sum/2,小於sum/2。可以考慮小於等於sum/2的情況。使用動態規劃解決這個問題,其實這是乙個np問題,只能盡量去接近sum/2這個值。
我們可以定義dp[k][s]代表從前k個數中去任意個元素,且k小於等於n,其和為s是否存在;之所以將選出的數之和放在下標中,而不是作為dp[k]的值,是因為那種做法不滿足動態規劃的前提——最優化原理。
#include #includeusing
namespace
std;
const
int maxn = 100
;const
int maxsum = 100000
;bool
dp[maxn][maxsum];
inta[maxn];
intmain()
int sum = 0
;
for(i = 1; i <= 2*n; i++)
sum +=a[i];
memset(dp,
false, sizeof
(dp));
dp[0][0] = true
;
for(k = 1; k <= 2*n; k++)}}
for(s = sum/2; s >= 1 && !dp[n][s]; s--);
cout
<< "
s1 =
"<< s << ";"
<< "
s2 =
"<< sum - s
}
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 ...
2 18 陣列分割
解法 2.18 陣列分割 class test 初始狀態 boolean dp i j false for all i all j dp i 0 true for all i 表示不選取任何整數,則被選取的整數的和為0 dp 0 nums 0 true 表示當i 0的時候,只有乙個正整數可以被選取,...