百度一道面试题的解

  有一个数组{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");
}

 

  

posted on 2012-10-26 15:28  暗夜的雪  阅读(209)  评论(0编辑  收藏  举报