组合算法(C语言+回溯)
2016-02-21 16:09
330 查看
/// 求从数组a[1..n]中任选m个元素的所有组合。
/// a[1..n]表示候选集,m表示一个组合的元素个数。
/// 返回所有组合的总数。
int combine(int a[], int n, int m)
{
m = m > n ? n : 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;
}
/// a[1..n]表示候选集,m表示一个组合的元素个数。
/// 返回所有组合的总数。
int combine(int a[], int n, int m)
{
m = m > n ? n : 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;
}
相关文章推荐
- 【转】C语言->数组名与指针
- 算法竞赛入门经典(第二版)-刘汝佳-第五章 C++与STL 习题(13/16)
- c++ 程序
- C++基本概念——构造函数
- VS2010编译警告:warning C4996:‘strcpy’:This function
- c++primer阅读笔记之关联容器学习
- 正确使用C++引用做返回值和参数
- 句柄C++
- C++:重载运算符避免数组越界
- C/C++程序开发中实现信息隐藏的三种类型
- C语言实现的高精度计算器
- UVa 1586, Molar Mass
- C/C++程序开发中实现信息隐藏的三种类型
- c语言入门之项目2.6——求1到m的乘积
- 关于C语言中的未初始化变量的值
- PID控制方法及C语言其实现
- 算法竞赛入门经典(第二版)-刘汝佳-第五章 C++与STL 例题(9/12)
- c语言入门之项目2.5——求1到m的倒数的和
- C++: 重载前缀运算符与重载后缀运算符(以++为例)
- 关于在xcode上写oc语言有id类型、出现ARC forbids explicit message sendof'dealloc'的问题