一个组合算法及实现
2009-05-22 18:00
288 查看
算法来源与互联网,该算法不是采用递归,效率比较高,在我们的一个项目中有实现,拿出来和大家共享
组合算法
本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
代表的数被选中,为0则没选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
然后从左到右扫描数组元素值的"10"组合,找到第一个"10"组合后将其变为
"01"组合,同时将其左边的所有"1"全部移动到数组的最左端。
当第一个"1"移动到数组的m-n的位置,即n个"1"全部移动到最右端时,就得
到了最后一个组合。
int comb(int m, int n)
{
if (m<=n||n==0)
return 0;
char *flag = new char[m];
int nRet = 1;
memset(flag, 0x0, m);
memset(flag, 0x1, n);
//一种组合
while(true)
{
k = 0;
for (i = 0; i < size-1; i++)
{
if (flag[i] == '/1')//找到"10"
{
if (flag[i+1] == '/0')
{
flag[i] = '/0';
flag[i+1] = '/1';
if (i>k && k>0)
{
memset(flag, 0x0, i);
memset(flag, 0x1, k);
}
break;
}
else
{
k++;
}
}
}
if (i>=size-1) break;
//一种组合
nRet ++;
}
delete[] flag;
return nRet;
}
运行结果事例
例如求5中选3的组合:
1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5
组合算法
本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
代表的数被选中,为0则没选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
然后从左到右扫描数组元素值的"10"组合,找到第一个"10"组合后将其变为
"01"组合,同时将其左边的所有"1"全部移动到数组的最左端。
当第一个"1"移动到数组的m-n的位置,即n个"1"全部移动到最右端时,就得
到了最后一个组合。
int comb(int m, int n)
{
if (m<=n||n==0)
return 0;
char *flag = new char[m];
int nRet = 1;
memset(flag, 0x0, m);
memset(flag, 0x1, n);
//一种组合
while(true)
{
k = 0;
for (i = 0; i < size-1; i++)
{
if (flag[i] == '/1')//找到"10"
{
if (flag[i+1] == '/0')
{
flag[i] = '/0';
flag[i+1] = '/1';
if (i>k && k>0)
{
memset(flag, 0x0, i);
memset(flag, 0x1, k);
}
break;
}
else
{
k++;
}
}
}
if (i>=size-1) break;
//一种组合
nRet ++;
}
delete[] flag;
return nRet;
}
运行结果事例
例如求5中选3的组合:
1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5
相关文章推荐
- 请用Java实现一个算法:由a-z、0-9组成3位的字符密码,并打印所有可能的密码组合。
- 【每天算法2】:用java语言实现,一个组数:122345这6个数,打印出它所有可能的组合;要求4不能在第3位,3和5不能相连。
- 用JAVA编写一个算法实现对一个字符数组的所有元素的所有组合
- 用Erlang实现一个组合算法
- 实现一个算法1/2+1/3+1/4+........Hangover问题
- 【Scala】实现一个求平方根的算法
- 两个堆栈实现一个队列和一叠两个队列实现【算法导论课后题】
- 一个类24点问题算法实现
- 整型数组处理算法(十二)请实现一个函数:最长顺子。[风林火山]
- 实现一个字符串的所有排列组合
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合) 继承、实现、依赖、关联、聚合、组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父
- 算法导论10.1-6习题解答(用两个栈实现一个队列)
- 假设一个数组A[n]数据均为整形,设计一个O(n)的算法,实现将所有奇数放在数组左侧,所有偶数放在右侧
- java 高效率的排列组合算法(java实现)
- 经典递归算法之排列,组合,集合和换零钱, Python yield实现.
- 自己实现的一个寻径算法的框架,具体算法采用动态库模式,可以非常方便灵活地尝试多种寻径算法
- 设计技巧15:模板方法 Template Method 在一个方法中定义一个算法的骨架,而将一些步骤延迟的子类中,实现Ioc
- 一个应用实例详解卡尔曼滤波及其算法实现
- perfect shuffle 算法的一个线性复杂度实现
- 设计一个算法,要求在20个数字中(0到19)随机选取十个数字,但是这十个数字不能重复(用C语言或者OC实现)