题目
https://www.luogu.com.cn/problem/P1036
思路
主要用到了使用dfs来生成排列,题目不是生成全排列。
生成全排列的代码
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 20;
int a[maxn];
int b[maxn];
bool vis[maxn];
int n;
void dfs(int cur){
if(cur == n){
for(int i=0;i<n;i++)printf("%d ",b[i]);
printf("\n");
return;
}
for(int i=0;i<n;i++){
if(!vis[i]){
vis[i] = 1;
b[cur] = a[i];
dfs(cur + 1);
vis[i] = 0;
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)scanf("%d", &a[i]);
dfs(0);
return 0;
}
本题AC代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 20 + 10;
int a[maxn];
bool vis[maxn];
int n,k;
int ans;
bool judge(int n){
for(int i=2;i<=floor(sqrt(n) + 0.5);i++){
if(n%i == 0)return 0;
}
return 1;
}
void dfs(int cur, int l,int loc){
if(loc > n)return;
if(l == k){
if(judge(cur)){
ans++;
}
return;
}
for(int i=loc;i<n;i++){
if(!vis[i]){
vis[i] = 1;
dfs(cur + a[i], l + 1, i + 1);
vis[i] = 0;
}
}
}
int main(){
scanf("%d %d",&n, &k);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
dfs(0, 0, 0);
cout<<ans<<endl;
return 0;
}