回溯算法写的组合

来源:互联网 发布:response.json 编辑:程序博客网 时间:2024/05/15 05:37
#include <string.h>#include <stdlib.h>using namespace std;int combine(int a[], int n, int m){    int* order = new int[m+1];    for(int i=0; i<=m; i++)        order[i] = i-1;            // 注意这里order[0]=-1用来作为循环判断标识    int count = 0;    int k = m;    bool flag = true;           // 标志找到一个有效组合    while(order[0] == -1)    {        if(flag)                   // 输出符合要求的组合        {            for(int i=1; i<=m; i++)            {                cout << a[order[i]] << " ";            }            cout << endl;            count++;            flag = false;        }        order[k]++;                // 在当前位置选择新的数字        if(order[k] == n)          // 当前位置已无数字可选,回溯        {            order[k--] = 0;            continue;        }        if(k < m)                  // 更新当前位置的下一位置的数字        {            order[++k] = order[k-1];            continue;        }        if(k == m)            flag = true;    }    delete[] order;    return count;}int main(){    int a[]={1,2,3,4,5,6,7};    cout << combine(a,7,3)<<endl;    cout << "Hello world!" << endl;    return 0;}

原创粉丝点击