• 百度一道面试题的解


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

      

  • 相关阅读:
    一个web应用的诞生(4)
    一个web应用的诞生(7)
    一个web应用的诞生(6)
    HTTP状态码大全(转自wiki)
    十分钟搞懂什么是CGI
    HTTP真的很简单
    QT程序在发布的时候应注意的地方
    QT中获取选中的radioButton的两种方法
    WinEdit编辑器中中文乱码
    C++ lstrlen()
  • 原文地址:https://www.cnblogs.com/darknightsnow/p/2741314.html
Copyright © 2020-2023  润新知