回溯算法写的组合
来源:互联网 发布: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;}