组合生成算法

上学期在离散课上学到的基于字典序的组合生成算法,在这里整理一下:
目的:
集合1~n已经确定,已知当前组合,按照字典序生成下一个组合;
1.所有组合都是按字典序升序排列;
2.每个组合内部元素互不相同,且升序排列;
算法:
最大值:从左向右共有r个位置,每个位置的元素的最大值是不同的。分别为:第1个:n-r+1……第n个:n;
思路细化:
已知当前组合(s[1],s[2]…s[r]),
1.从右向左检查首个未达到最大值的元素,假设为s[i];
2.s[i]=s[i]+1;
3.for j: i+1 to r—s[j]=s[j-1]+1;

void next_comb(int s[],int n,int r)
{
    int i,j,max_val;
    max_val=n;
    i=r;
    while( s[i] == max_val )
    {
        i--;
        max_val--;
    }
    s[i]++;
    for( j = i+1; j <= r; j++ )
        s[j]=s[j-1]+1;
    return ;
}

注:上面算法是针对1~n集合的组合生成算法,如果拓展为任意元素不重复集合其实也很简单,将元素递增排序并存储到集合中去,我们可以把上述方法中的s[i]当做目标集合的下标,每生成一个组合按照对应下标输出就能实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值