回溯法应用:1,2,5,10四个数任意次数相加得到一个数N

来源:互联网 发布:淘宝女装2016top排行榜 编辑:程序博客网 时间:2024/06/05 18:02
    #include <iostream>      #include <vector>            using namespace std;      vector<int> vec;      const int a[4] = {1, 2, 5, 10};                      void backup(int N)    {          if (N == 0)          {              vector<int>::iterator it = vec.begin();              for (; it != vec.end(); ++it)                  cout<< *it <<" ";              cout<<endl;              return;          }                if (N < 0) return;                for (int i = 0; i < 4; ++i)          {              if (vec.empty() || a[i] >= vec.back())// 非降序,为了去掉重复的组合              {                  vec.push_back(a[i]);                  backup(N-a[i]);                  vec.pop_back();              }          }      }            int main(int argc, char* argv[])      {          backup(20);          return 0;      }  

或者

#include <iostream>#include <string>   using namespace std;int count = 0;void printAll(int* a, int n, int diff, int* path, int cur){    if(diff == 0)    {        count++;        for(int i = 0; i < cur; i++)        {            cout << path[i] << " ";        }        cout << endl;        return;    }    for(int i = 0; i < n; i++)    {        if( (cur == 0 || a[i] >= path[cur-1]) && a[i] <= diff )        {            path[cur] = a[i];            printAll(a, n, diff-a[i], path, cur+1);        }    }}int main()  {      int a[] = {1,2,5,10};    int b = 20;    int* path = new int[30];    printAll(a, 4, b, path, 0);    cout << count << endl;    return 0;  }  


0 0