数的组合【数组】
时间: 1ms 内存:128M
描述:
设整数x1,x2,…,xN已存放在数组A中,编写一递归过程,输出从这n个数中取出所有k 个数的所有组合(k<=n)。例:若A中存放的数是1,2,3,4,5,k为3,则输出结果应为:543,542,541,532,531,521,432,431,421,321。
输入:
1 2 3 4 5
3
输出:
543,542,541,532,531,521,432,431,421,321
示例输入:
5 6 1 2 9 5
4
示例输出:
5921,5926,5925,5916,5915,5965,5216,5215,5265,5165,9216,9215,9265,9165,2165
提示:
参考答案(内存最优[1092]):
#include <stdio.h>
#include <stdlib.h>
int a[100],b[100];
int t=0;
void combine(int n,int k,int K)
{
int i,j;
for(i=n;i>=k;i--){
b[k-1]=i-1;
if(k>1)
combine(i-1,k-1,K);
else
{
if(t!=0)
{
printf(",");
}
t++;
for(j=K-1;j>=0;j--)
{
printf("%d",a[b[j]]);
}
}
}
}
int main()
{
int sum=1,i,m=0,n=0,k,K;
while(1)
{
scanf("%d",&a[n++]);
if(getchar()=='\n')
break;
}
scanf("%d",&k);
K=k;
combine(n,k,K);
return 0;
}
参考答案(时间最优[0]):
#include <stdio.h>
void combine(int a[], int n, int m, int b[], int M);
int t=0;
int main(void)
{
int i=0,k;
int a[100], b[100];
char ch;
for(i;; i++)
{
scanf("%d%c",&a[i],&ch);
if(ch=='\n') break;
}
scanf("%d",&k);
combine(a, i+1, k, b, k);
return 0;
}
void combine(int a[], int n, int m, int b[], int M)
{
int i, j;
for (i = n; i >= m; i--)
{
b[m - 1] = i - 1;
if (m > 1)
combine(a, i - 1, m - 1, b, M);
else
{
if(t!=0)
{
printf(",");
}
t++;
for (j = M - 1; j >= 0; j--)
printf("%d", a[b[j]]);
}
}
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。
