dfs模板(p1036)
P1036 [NOIP 2002 普及組] 選數
題目描述
已知 \(n\) 個整數 \(x_1,x_2,\cdots,x_n\),以及 \(1\) 個整數 \(k\)(\(k<n\))。從 \(n\) 個整數中任選 \(k\) 個整數相加,可分別得到一系列的和。例如當 \(n=4\),\(k=3\),\(4\) 個整數分別為 \(3,7,12,19\) 時,可得全部的組合與它們的和為:
\(3+7+12=22\)
\(3+7+19=29\)
\(7+12+19=38\)
\(3+12+19=34\)
現在,要求你計算出和為素數共有多少種。
例如上例,只有一種的和為素數:\(3+7+19=29\)。
輸入格式
第一行兩個空格隔開的整數 \(n,k\)(\(1 \le n \le 20\),\(k<n\))。
第二行 \(n\) 個整數,分別為 \(x_1,x_2,\cdots,x_n\)(\(1 \le x_i \le 5\times 10^6\))。
輸出格式
輸出一個整數,表示種類數。
輸入輸出樣例 #1
輸入 #1
4 3
3 7 12 19
輸出 #1
1
說明/提示
AC代碼
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8;
int a[21];
int n,k,cnt;
bool iszh(int x)
{
if (x == 1)
return false;
for (int i = 2; i * i < x; i++)
{
if (x % i == 0)
return false;
}
return true;
}
void dfs(int dep,int i,int sum){
if(dep==k){
if(iszh(sum)) cnt++;
return;
}
if(i>=n) return;
dfs(dep+1,i+1,sum+a[i+1]);
dfs(dep,i+1,sum);
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(0,0,0);
cout<<cnt<<endl;
return 0;
}

浙公網安備 33010602011771號