求高手解答一个算法!!!!!!

来源:百度知道 编辑:UC知道 时间:2024/05/12 05:00:20
用C实现,集合{1,2,....,n} ,输出所有有r个数的子集合(1=<r<=n)

#include<stdio.h>
int n,a[100],r; /*数组a为记录集合的元素*/
int ans[100]; /*记录子集的元素*/
void solve(int k,int p) /*在子集数组ans里已有k个元素,p为ans最后的元素下标*/
{
int i;
if(k>r) /*已经找到一个子集*/
{
for(i=1;i<=r;i++) /*显示子集*/
printf("%d ",ans[i]);
printf("\n");
return;
}
if(p>n) /*找不到子集*/
return;
for(i=p+1;i<=n;i++) /*递归查找子集*/
{
ans[k]=a[i]; /*当前元素放进子集数组*/
solve(k+1,i); /*下一个元素*/
}
}
void main()
{
int i;
scanf("%d%d",&n,&r);
for(i=1;i<=n;i++) /*初始集合数组元素*/
a[i]=i;
solve(1,0); /*查找开始*/
}

上面的程序还可以优化,可以让速度更快些,更省空间!你自己看看吧!还有最好是看懂程序,不要照抄!你还可以用其他方法,这是用了递归回溯算法!

#include <stdio.h>

static int a[1024];
static int num;

void get(int n, int k)
{
int i = 0;
if (k <= 0)
{
for (i = 0; i < num; i++)
{
printf