”FreeWheel 的一道编程题“——留下的题目的解答

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;
}

猜你喜欢

转载自blog.csdn.net/qq_40953281/article/details/80156311