思路:对于数组中的每一个数,观察它们取或不取对最后结果的影响。并且记录下若干数字的和与M的差的绝对值最小时所取到的若干数字。
/*
* 微软100, 9月28题, 输入和接近M
* sum 即为M值
* num排序的数组
* len数组长度
* vec所取到若干数字构成的向量
* currentSum vec中的数字的和
*/
int diff = INT_MAX;
vector<int> minVec;
void FindAppM(int sum, int currentSum,int num[], int len, int i, vector<int>& vec)
{
if(i >= len)
return;
//
if(abs(currentSum - sum) < diff)
{
diff = abs(currentSum - sum);
minVec = vec;
}
vec.push_back(num[i]);
FindAppM(sum, currentSum+num[i],num, len, i+1, vec);
vec.pop_back();
FindAppM(sum, currentSum,num, len, i+1, vec);
}
int main() {
vector<int> sumVec1;
int num123[5] = {1,2,6,12,51};
FindAppM(4, 0, num123, 5, 0, sumVec1);
for(int i=0; i<minVec.size(); i++)
{
cout<<minVec[i]<<"*";
}
printf("\n***********\n");
转载:https://blog.csdn.net/tom555cat/article/details/39186931