原题:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1079
时间:2014.2.7
类型:回溯,dfs
源码:
#include<iostream>
#include<cmath>
using namespace std;
int a[21],n,k,x[21],cnt=0;
bool used[21]={false};
bool pd(int s)
{
for(int i=2;i<=sqrt(s);i++) { if(s%i==0) { return false; } }
return true;
}
void search(int s,int sum,int l)
{
if(s==k+1)
{
if(pd(sum)) { cnt++; }
return;
}
for(int i=l;i<=n;i++)
{
if(used[i]) { continue; }
a[s]=x[i];
used[i]=true;
search(s+1,sum+a[s],i+1);
a[s]=0;
used[i]=false;
}
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>x[i];
}
search(1,0,1);
cout<<cnt;
//system("pause");
return 0;
}
最后状态:AC
总结:一开始没考虑重复..