题目: 有一个无序、元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组的和最接近。
运用动态规划的方法求解此问题, 找最接近数组和sum的一半的一个n个数据的数列。
找小于sum/2的一个数组。
分配数组isOk[sum/2], isOk[i] 表示是否存在序列之和为i
分配数组vv_data[sum/2], vv_data[i]表述序列和为i的序列的长度,长度可能不是一个值,所以vv_data[i]是一个数组
分别对每个数,更新isOk, vv_data的值,最后查找小于sum/2的,序列长度为n的最大值.
#include <iostream>
#include <vector>
#include <set>
using namespace std;
class DynamicHalfApproach
{
public:
DynamicHalfApproach(vector<int> &data)
{
m_vData = data;
}
int getHalfApproach()
{
int sum = 0;
for (vector<int>::iterator iter = m_vData.begin(); iter != m_vData.end(); ++iter)
{
sum += *iter;
}
int half = sum / 2;
cout << "half = " << half << endl;
vector<bool> isOk;
isOk.push_back(true);
for(int i = 1; i <= half; ++i)
{
isOk.push_back(false);
}
vector< set<int> > vv_data;
set<int> iset;
iset.insert(0);
vv_data.push_back(iset);
for (int i = 1; i <= half; ++i)
{
set<int> iset;
vv_data.push_back(iset);
}
for (int j = 0; j < m_vData.size(); j++)
{
for(int i = half; i>= 0; --i)
{
if(isOk[i] && (m_vData[j] + i <= half))
{
isOk[m_vData[j] + i] = true;
set<int> &iset = vv_data[i];
for(set<int>::iterator iter = iset.begin(); iter != iset.end(); ++iter)
{
vv_data[m_vData[j] + i].insert(*iter + 1);
}
}
}
}
for (int i = 1; i <= half; ++i)
{
cout << "*******************************" << endl;
cout << "i = " << i << endl;
set<int> &iset = vv_data[i];
for(set<int>::iterator iter = iset.begin(); iter != iset.end(); ++iter)
{
cout << *iter << " ";
}
cout << endl;
cout << "*******************************" << endl;
}
for (int i = half; i >= 0; --i)
{
if (isOk[i])
{
set<int> &iset = vv_data[i];
for(set<int>::iterator iter = iset.begin(); iter != iset.end(); ++iter)
{
if (*iter == m_vData.size() / 2)
return i;
}
}
}
return -1;
}
private:
vector<int> m_vData;
};
int main(void)
{
vector<int> ivect;
ivect.push_back(1);
ivect.push_back(5);
ivect.push_back(7);
ivect.push_back(8);
ivect.push_back(9);
ivect.push_back(6);
ivect.push_back(3);
ivect.push_back(11);
ivect.push_back(20);
ivect.push_back(17);
DynamicHalfApproach helper(ivect);
cout << helper.getHalfApproach() << endl;
system("pause");
return 0;
}