题目链接:传送门(点我)
思路:dfs暴力全排列,然后使用set去重,因为我不知道什么叫不降原则,虽然写的多一点,但是思路很简单
缺点:如果数据过大,肯定会爆,这题是看在数据不大的情况下这样做
#include<bits/stdc++.h>
using namespace std;
int a[30],vis[30],n,k,ans;//vis[i]表示第i个数被标记
set<set<int>>se;
int judge(int num){
if(num<=1)return 0;
for(int i=2;i*i<=num;i++)
if(num%i==0)return 0;
return 1;
}
void dfs(int x,int step,set<int>path)//x表示第x个数
{
if(step==k){
if(!se.count(path)){
se.insert(path);
int sum=0;
for(set<int>::iterator it=path.begin();it!=path.end();it++)
sum+=a[*it];
if(judge(sum))ans++;
}
return ;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i]=1;path.insert(i);
dfs(i,step+1,path);
vis[i]=0;path.erase(i);
}
}
}
int main()
{
cin>>n>>k;
set<int>s;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
s.insert(i);
vis[i]=1;
dfs(i,1,s);
vis[i]=0;
s.erase(i);
}
return cout<<ans<<endl,0;
}