组合算法(C语言+回溯)
来源:互联网 发布:零售业软件 编辑:程序博客网 时间:2024/06/10 03:18
/// 求从数组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;
}
0 0
- 组合算法(C语言+回溯)
- 排序组合回溯算法
- C语言算法—(生成子集的升级)生成数据的全部组合(含重复数字)(类似建立树的回溯法)
- C语言算法—(生成数字的组合升级)生成数据的全排列(类似建立树的回溯法)
- 回溯算法解迷宫问题(C语言)
- 回溯算法解迷宫问题(C语言)
- 回溯算法----C语言 迷宫问题
- C语言算法之回溯法
- 回溯算法写的组合
- C语言算法,八皇后问题,回溯算法
- C语言实现排列/组合算法
- 组合算法实现C语言,非递归
- 组合算法的实现,递归,C语言
- 迷宫求解(C语言回溯法)
- c语言素数环问题(回溯)
- c语言三阶幻方问题(回溯)
- C语言链栈以及回溯算法解决迷宫问题
- 2014蓝桥杯C语言第六题 --回溯算法解决
- 【Android】安卓学习笔记之广播(二)静态注册实现开机启动
- Ubuntu使用ppa源安装最新版git
- PEP 8 代码规范
- JAVA学习记录 -- final和static
- STM32工程建立
- 组合算法(C语言+回溯)
- Android Studio在类中找不到R文件
- Java并发编程:Thread类的使用
- 【慕课笔记】第三章 JAVA中必须了解的常用类 第5节 Calendar类的应用
- Android Wear 进阶 2 Creating Wearable Apps-创建手表程序
- c语言入门之项目2.8——求1到m间的奇数和
- 高性能Mysql主从架构的复制原理及配置详解
- 循环结构(for语句)
- 乐视生态世界发布会官方图文直播(2016年01月12日 15:00)