https://blog.csdn.net/qq_40953281/article/details/79332600
这篇博客讲了一道关于二进制的编程题
在文章末尾留了一道相似但难度稍微要高一点的题目:
A: n个不同整数的所有组合
描述
计算n个不同整数的所有的组合
输入
第1行是一个整数m,表示随后有m组数据。
每组数据占一行,第一个整数n表示随后有n个不同的整数。
输出
对每组数据,输出这n个不同整数的不同组合,含空组合。每个组合输出前输出“--> ”。
要求必须按照上课讲的递归方法来写,先输出包含该元素的情况,再输出不包含的情况,这样才能保证输出顺序和标准答案一致。
样例
输入 |
输出 |
2 2 1 2 3 1 2 3 |
--> 1 2 --> 1 --> 2 --> --> 1 2 3 --> 1 2 --> 1 3 --> 1 --> 2 3 --> 2 --> 3 --> |
对于这个本质上是一道组合题目,找出一个数列的各个组合:
这种题目一般都是通过递归解决
自己设置一个数组temp存储0,1只需要将最后是1的给输出就好了
原数组A与TEMP坐标相对映
原理如下:对第一个样例1,2
有如下效果所以将原数组下标是1的打印出来
就得到结果
代码如下:
#include <stdio.h>
void comb(int a[], int b[], int f, int n) {
if (f == n)
{
printf("--> ");
for (int k = 0; k < n; k++)
{
if (b[k])
{
printf("%d ", a[k]);
}
}
printf("\n");
return;
}
b[f] = 1;
comb(a, b, f + 1, n);
b[f] = 0;
comb(a, b, f + 1, n);
}
int main() {
int m;
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
int n;
int b[1000];
int a[1000];
scanf("%d", &n);
for (int j = 0; j < n; j++)
{
scanf("%d", &a[j]);
}
comb(a, b, 0, n);
}
return 0;
}