百度一道面试题的解
有一个数组{1,4,6,2,8,5,7,3,9,10},要求用程序输出所有和为10的组合(10也包括在内)
递归,回溯
对于其中一个数Ni,其和为某个数的组合可以分解为两个互不相干的子问题:
1、在0到i-1的范围内寻找和为(当前和)的组合
2、(当前和)=(当前和)-(Ni),然后在0到i-1的范围内寻找和为(当前和)的组合
为了打印遍历路径,设置了一个辅助vector,每次遇到情况2的时候把这个数存放在vector中,情况2遍历完后,再pop出,继续找情况1
废话就这么多,上码:
#include <stdio.h> #include <vector> using namespace std; vector<int> path; void printVector(vector<int>& path) { for (vector<int>::iterator it=path.begin();it!=path.end();it++) { printf("%d,",*it); } } void findSum10(int* array,int sum,int pos) { if (pos<-1 || sum<0) //注意此处如果是pos<0,那么和array[0]相组合为sum的数将不会打印出来!或者将if(sum==0)放在这个if之前也行 { return; } if (sum==0) { printVector(path); printf("\n"); return; } path.push_back(array[pos]);//情况2 findSum10(array,sum-array[pos],pos-1); path.pop_back(); findSum10(array,sum,pos-1);//情况1 } int main() { int a[10]={1,4,6,2,8,5,7,3,9,10}; int sum=10; findSum10(a,sum,9); system("pause"); }