當(dāng)時經(jīng)理要求算法一定能夠得出最優(yōu)解,但測試多組數(shù)據(jù),沒有發(fā)現(xiàn)哪一種實現(xiàn)能得到最優(yōu)解。后來翻了一下《數(shù)據(jù)結(jié)構(gòu)、算法與應(yīng)用--C++語言描述》,忽然想到,原來這個是一個典型貪婪算法問題,這個問題沒有最優(yōu)解,用貪婪算法來解決這個問題可以讓每一次結(jié)果逼近最優(yōu)。實現(xiàn)如下(注:代碼是我今天寫的):
typedef vector<int> IntVector;
typedef vector<IntVector> IntMat;
void DeuceNumber(const IntVector &SourceVecNum,
const int nShare,
IntMat &OutVecVecNum)
{
IntVector copySourceNum = SourceVecNum;
sort(copySourceNum.begin(), copySourceNum.end(), greater<int>());
IntVector sum(nShare);
OutVecVecNum.resize(nShare);
for (int i = 0; i < copySourceNum.size(); i++)
{
const int nMinSumPos = min_element(sum.begin(), sum.end()) - sum.begin();
OutVecVecNum[nMinSumPos].push_back(copySourceNum[i]);
sum [nMinSumPos] += copySourceNum[i];
}
}
typedef vector<IntVector> IntMat;
void DeuceNumber(const IntVector &SourceVecNum,
const int nShare,
IntMat &OutVecVecNum)
{
IntVector copySourceNum = SourceVecNum;
sort(copySourceNum.begin(), copySourceNum.end(), greater<int>());
IntVector sum(nShare);
OutVecVecNum.resize(nShare);
for (int i = 0; i < copySourceNum.size(); i++)
{
const int nMinSumPos = min_element(sum.begin(), sum.end()) - sum.begin();
OutVecVecNum[nMinSumPos].push_back(copySourceNum[i]);
sum [nMinSumPos] += copySourceNum[i];
}
}
我上傳了一個VC的測試工程,有興趣的朋友點此下載。
理論的依據(jù)不僅指導(dǎo)了實踐的選擇,同時給選擇以有力的支撐。
2007年就要結(jié)束了,在此預(yù)祝大家在新的一年里:身體健康,平安如意!


