谢谢坂本龙一
总结:看起来越漂亮的代码,其实越简洁,反而越容易写,少了很多坑坑窝窝,要相信一切都是协调的。
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);
}