思路来自:http://blog.csdn.net/randyjiawenjie/article/details/6335208
也是同样采用背包问题的思路:对于一个数字,加入背包或不加入背包。
看代码:
/*
* 微软100,21题,和为M
* start初始为1,end初始为n
* currentSum为当前vec中元素的和
* sum为输入的M值
*/
void findSumM(int sum, int currentSum, int start, int end, vector<int>& vec)
{
if(start > end)
return;
if(currentSum == sum)
{
//打印
for(unsigned i=0; i<vec.size(); i++)
{
cout<<vec[i]<<"*";
}
cout<<endl;
return;
}
if(currentSum + start > sum)
{
return;
}
//使用start这个数字
vec.push_back(start);
findSumM(sum, currentSum+start, start+1, end, vec);
//不使用start这个数字
vec.pop_back();
findSumM(sum, currentSum, start+1, end, vec);
}
测试代码:
int main() {
vector<int> sumVec;
findSumM(10, 0, 1, 7, sumVec);
printf("****************\n");
输出结果:
1*2*3*4*
1*3*6*
1*4*5*
2*3*5*
4*6*
****************