NYOJ-组合数

时间:2021-11-02 22:35:38
#include <stdio.h>
#include <malloc.h>
int main()
{
int *shu=NULL,n,r,i,j,count=;
int flag[];
scanf("%d%d", &n,&r);
if(n==r)
{ while(n)
{
printf("%d",n);
n--;
}
putchar('\n');
}
else
{
shu=(int *)malloc((r+)*sizeof(int));
for(i=r; i>=; i--)
shu[i]=n--;
for(i=; i<=r; i++)
flag[i]=;
for(i=r; i>=; i--)
printf("%d", shu[i]);
putchar('\n');
j=;
while()
{
while(j<r&&shu[j]==j)
{
flag[j]=; /*标记*/
j++;
shu[j]--;
for(i=j; i>=; i--)
shu[i-]=shu[i]-;
for(i=r; i>=; i--)
printf("%d", shu[i]);
putchar('\n');
}
if(shu[j]==j)
flag[j]=;
for(i=,count=; i<=r; i++)
if(flag[i]==)
count++;
if(count==r) break;
j=;
shu[j]--;
for(i=r; i>=; i--)
printf("%d", shu[i]);
putchar('\n');
}
}
return ;
}

用递归解的

#include<stdio.h>
int n,m;
int num[]; int dfs(int top, int v)
{
int i;
if (v == ) {
for(i=m; i>; i--)
printf("%d", num[i]);
printf("\n");
return ;
}
for(i=top; i>=v; i--) {
num[v] = i;
dfs(i-, v-);
}
} int main()
{
while(~scanf("%d%d", &n, &m)) {
dfs(n, m);
}
return ;
}