题目:小明假期同爸爸一起去书店,他选中了六本书,每本书的单价分别为:3.1,1.7,2,5.3,0.9和7.2。不巧的是,小明的爸爸只带了十几块钱,为了让小明过一个愉快的假期,爸爸扔然同意买书,但提邮购一个要求,要小明从六本书中选出若干本,使得单价相加所得的和同10最接近。你能够帮助小明解决这个问题吗?
/*
题目:小明假期同爸爸一起去书店,他选中了六本书,
每本书的单价分别为:3.1,1.7,2,5.3,0.9和7.2。
不巧的是,小明的爸爸只带了十几块钱,为了让小明
过一个愉快的假期,爸爸扔然同意买书,但提邮购一
个要求,要小明从六本书中选出若干本,使得单价相
加所得的和同10最接近。你能够帮助小明解决这个问题吗?
by as1138 2012-08-12
*/
#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;
typedef multimap<float,list<float> >::iterator MMITER;
void zuhe(float* fData,int len,int cur,int num);
template <typename T>
T myabs(T num);
float fBookPrice[6] = {3.1,1.7,2,5.3,0.9,7.2};
std::vector<float> fVecTmp;
multimap<float,list<float> > fMMapRes;
float fmin = 100;
int main(int argc, char const *argv[])
{
for(int i=1;i<7;++i)
zuhe(fBookPrice,6,0,i);
pair<MMITER,MMITER> pa;
pa = fMMapRes.equal_range(fmin);
MMITER it;
for(it=pa.first;it!=pa.second;++it)
{
list<float>::iterator itL = it->second.begin();
float sum = 0;
for(;itL!=it->second.end();++itL)
{
cout<<*itL<<" ";
sum += *itL;
}
cout<<"sum:"<<sum<<endl;
}
return 0;
}
template<typename T>
T myabs(T num)
{
return num>0?num:0-num;
}
void zuhe(float* fData,int len,int cur,int num)
{
if (num == 0){
float fSum = 0;
list<float> fListParam;
for(size_t i=0;i!=fVecTmp.size();++i){
fSum += fVecTmp[i];
fListParam.push_back(fVecTmp[i]);
}
float fAbs = myabs(fSum-10);
fMMapRes.insert(make_pair(fAbs,fListParam));
fmin = fAbs>fmin?fmin:fAbs;
return;
}
for (int i=cur;i!=len;++i)
{
fVecTmp.push_back(fData[i]);
zuhe(fData,len,i+1,num-1);
fVecTmp.pop_back();
}
}