Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1523880
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2010-01-11 16:07:57

#include
using namespace std;
const int MAX=10;
int a[MAX];
void com(int n ,int m,int s)    //s表示当前被选元素的下标
{
    if(s==m+1)   
    {
        for(int i=1;i<=m;i++)
            cout<        cout<        return;
    }
    for(int i=a[s-1]+1;i    {
        a[s]=i;
        com(n,m,s+1);
    }
}
int main()
{
    a[0]=0;
    com(5,3,1);
    return 0;
}


//非递归算法
void comb_back(int m,int r)
{
    int *a = new int[r];//创建一个新数组存储构成组合的3个数
    int i,j,k=0;
    i=0,a[i]=1;
    do{
//a[i]-i<+m-r+1 是判断a[i]的值是否在范围之内如i=0时,a[i]最大可以为倒数第r个数,这样本组数的最大值才不至于大过m
        if(a[i]<=m-r+1+i)
        {
            if(i==r-1)  //到了最底层,就一直运行这一分支
            {
                cout<<"第"<<++k<<"组:  ";
                for(j=0;j                    cout<                cout<                a[i]++;
                continue;
            }
            i++;            //前进到下一层试探,深搜
            a[i]=a[i-1]+1;
        }else{                //回溯到上一层进行试探
            if(i==0)
                return;        //已经找到了所有层的解
            a[--i]++;        //前一层的数字增加1,继续进行向前试探,其总共就r层
        }   
    }while(1);
    delete []a;
}
int main()
{
    comb_back(5,3);
}
阅读(3844) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~