组合数
时间限制:3000 ms | 内存限制:65535 KB
难度:3
-
描述
- 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
思想:深搜
代码1、多组测试数据
<span style="font-size:18px;">#include<stdio.h>
#include<string.h>
int a[11];
int book[11];
int n,r;
void dfs(int k)
{
int i,j;
if(r==k-1)
{
for(i=1;i<k;i++)
{
printf("%d",a[i]);
}
printf("\n");
return ;
}
for(i=n;i>=1;i--)
{
if(book[i]==0&&a[k-1]>i)
{
book[i]=1;
a[k]=i;
dfs(k+1);
book[i]=0;
}
}
return ;
}
int main(void)
{
while(scanf("%d%d",&n,&r)!=EOF)
{
memset(book,0,sizeof(book));
a[0]=9999;
dfs(1);
}
return 0;
} </span>
代码2、一组测试数据
<span style="font-size:18px;">#include<stdio.h>
int a[12];
int b[12];
int fun(int m,int n,int k)
{
int i,j;
for(i=m;i>=1;i--)
{
if(b[i]==1&&i<a[k-1])
{
b[i]=0;
a[k]=i;
}
else
{
continue;
}
if(n==k)
{
for(j=1;j<=n;j++)
{
printf("%d",a[j]);
}
printf("\n");
}
else
{
fun(m,n,k+1);
}
b[i]=1;
}
return 0;
}
int main(void)
{
int i,n,m;
for(i=0;i<10;i++)
{
b[i]=1;
}
a[0]=9999;
scanf("%d%d",&m,&n);
fun(m,n,1);
return 0;
} </span>