从1-10选5个数字组合,所有的组合结果用计算机输出

如果用C语言编写的话,程序代码应该是什么

这是一个回溯算法的经典例子,可以用下面的函数和程序实现,该程序整体看来主体只用一个循环语句,分为向前试探阶段和向后回溯阶段,需认真理解代码
#include <iostream.h>

const int maxn=100;

int a[maxn];
void combback(int n,int r)
{
int i=0,j;
a[i]=1;
do{
if(a[i]-i<=n-r+1) //还可以向前试探
{
if(i==r-1) //已经找到一个组合输出
{
for(j=0;j<r;j++)
cout<<a[j]<<' ';
cout<<endl;
a[i]++;
continue;
}
i++; //向前试探
a[i]=a[i-1]+1;
}
else //回溯
{
if(i==0)return; //已经找完了所有解
a[--i]++;
}
}while(1);
}

void main()
{
combback(10,5);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-21
//ok 了,关键思想,先取最原始的5个数,最右边的一个加1,加到不到加的时候,再进次右边一个加1,然后后面的数依次变成前一个加1,即有1 2 3 4 5-->1 2 3 4 6
1 2 3 4 10-->1 2 3 5 6,实现代码:
#include<stdio.h>
int a[5];
int visit[11];
main()
{
int i,j,t;
for(i=0;i<11;i++) visit[i]=0;
for(i=0;i<5;i++) {a[i]=i+1;visit[i+1]=1;}
do
{
t=0;
for(i=0;i<5;i++) printf("%d ",a[i]);printf("\n");
for(i=4;i>=0;i--)
{
for(j=1;;j++)
{
if(a[i]+j>10) break;
if(visit[a[i]+j]==0)
{
visit[a[i]]=0;
a[i]=a[i]+j;
visit[a[i]]=1;
t=1;break;
}
}
if(t==1)
{
for(j=i+1;j<5;j++)
{
visit[a[j]]=0;
a[j]=a[j-1]+1;
visit[a[j]]=1;
}
break;
}
}
}while(t==1);
}
相似回答