選數
題目描述
輸入
輸出
一個整數(滿足條件的種數)。
樣例輸入
4 3
3 7 12 19
樣例輸出
1
解題
這道題相當於在n集合中k個數的全排列的基礎上加上了判定素數了,但是不能把同一種排列調換順序,並且不用輸出所有排列方案。根據這種想法,我們可以很快寫出代碼,就像這樣:
#include<cmath>
#include<iostream>
using namespace std;
int n,k,x[21],num[21],cnt;
bool check()
{
int sum=0;
for(int i=1;i<=k;i++)
sum+=num[i];
for(int i=2;i<=sqrt(sum);i++)
if(sum%i==0)
return 0;
return 1;
}
void dfs(int a,int last)
{
for(int i=last;i<=n;i++)
{
num[a]=x[i];
if(a==k&&check()) cnt++;
else dfs(a+1,i+1);
}
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>x[i];
dfs(1,1);
cout<<cnt;
}
但是,我們也可以省去num數組直接定義全局變量sum,在dfs的語句裏直接用sum加上x[i],這樣省了計算總量的時間,也省了一個數組的空間,一舉兩得,代碼如下:
#include<cmath>
#include<iostream>
using namespace std;
int n,k,x[21],sum,cnt;
bool check()
{
for(int i=2;i<=sqrt(sum);i++)
if(sum%i==0)
return 0;
return 1;
}
void dfs(int a,int last)
{
for(int i=last;i<=n;i++)
{
sum+=x[i];
if(a==k&&check()) cnt++;
dfs(a+1,i+1);
sum-=x[i];
}
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>x[i];
dfs(1,1);
cout<<cnt;
}
怎麼樣,是不是簡單多了?(~ ̄▽ ̄)~