pta oj--递归,搜索的补充

谢谢坂本龙一

总结:看起来越漂亮的代码,其实越简洁,反而越容易写,少了很多坑坑窝窝,要相信一切都是协调的。

1.同样的套路,解决组合数,注意num初始化,注意用printf防止超时

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<fstream>
#include<vector>
using namespace std;
int a[22] = {0};
int N;
int total = 6;
int countt = 0;
int counti = 0;
int P[100] = {0};
vector<int> K;
int num = 0;
int KK[100];
int R;
int generate(int index) {
//	if(K.size()==R) {
//		size_t i;
//		for (i = 0; i < K.size()-1; i++) {
//			printf("%d ",K[i]);
//		}
//		printf("%d\n",K[i]);
//		return 0;
//	}
	if(num == R) {
		int i;
		for (i = 0; i < num-1; i++) {
			printf("%d ",KK[i]);
		}
		printf("%d\n",KK[i]);
		return 0;
	}
	if(index == N + 1) {
		return 0;///别再犯错了!!!
	}

	for(int ii = index; ii <= N; ii++) { //关键在于x是从下标开始,从自己开始
//		K.push_back(ii);
		KK[num++] = ii;
		generate(ii+1);//对位置的递归,不断拿数  下一个数
//		K.pop_back();
		num--;
	}
}
int main() {
//	freopen("d://in.txt","r",stdin);

	while(scanf("%d%d",&N,&R)!=EOF) {
		num = 0;
		generate(1);
	}
	return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int N;
int K;
int P[100];
int a[100];
int num;
int countt;
int pan(int aa) {
	int a = sqrt(aa);
	for(int i = 2; i <= a; i++) {
		if(aa % i == 0 ) return 1;
	}
	return 2;
}
void generate(int index) {
	if(num == K) {
		int ans = 0;
		for(int i =0; i < K; i++) {
			ans+=P[i];
		}
		if(pan(ans)==2)
			countt++;
		return;
	}
	if(index == N + 1) {
		return;
	}

	for(int i = index; i <= N; i++) {
		P[num++] = a[i];
		generate(i + 1);
		num--;
	}
}

int main() {
	scanf("%d%d",&N,&K);
	countt = 0;
	num = 0;
	for(int i = 1; i <= N; i++) scanf("%d",&a[i]);
	generate(1);
	printf("%d\n",countt);
}
发布了78 篇原创文章 · 获赞 3 · 访问量 6583

猜你喜欢

转载自blog.csdn.net/weixin_38023259/article/details/104851463
PTA