从大小为n的数组中取出m个数的组合

转载自http://www.cnblogs.com/shuaiwhu/archive/2012/04/27/2473788.html 作者:Microgoogle


思路:递归遍历思想。按数组下标从小到大,如果从5个数中取出4个数,则第一个数与第二个数,至少要选择一个。之后从剩余的数中选择3个,方法与之前相同,依次递归。即,如果要从array[p...q]中选择m个数(m<=q-p+1), 则必须从array[p...q-count+1]选择一个。假设选择了array[r],随后从array[r+1...q]中选择m-1个数。故递归外层循环是对取array[p...q-count+1]的遍历。

代码如下:

#include <cstdio>
#include <cstdlib>

using namespace std;

int arr[5] = {1, 2, 3, 4, 5};
int ARR_LEN = 5;
int NUM = 4;
int result[4];

void combination(int start, int count)
{
    for(int i = start; i < ARR_LEN + 1 - count; i++)
    {
        result[count - 1] = i;

        if(count - 1 == 0)
        {
            for(int j = NUM - 1; j >= 0; j--)
                printf("%d ", arr[result[j]]);
            printf("\n");

        }
        else
            combination(i + 1, count - 1);
    }
}

int main(void)
{
    combination(0, 4);
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值