P1036 [NOIP 2002 普及組] 選數
題目描述
已知 nnn 個整數 x1,x2,??,xnx_1,x_2,\cdots,x_nx1?,x2?,?,xn?,以及 111 個整數 kkk(k<nk<nk<n)。從 nnn 個整數中任選 kkk 個整數相加,可分別得到一系列的和。例如當 n=4n=4n=4,k=3k=3k=3,444 個整數分別為 3,7,12,193,7,12,193,7,12,19 時,可得全部的組合與它們的和為:
3+7+12=223+7+12=223+7+12=22
3+7+19=293+7+19=293+7+19=29
7+12+19=387+12+19=387+12+19=38
3+12+19=343+12+19=343+12+19=34
現在,要求你計算出和為素數共有多少種。
例如上例,只有一種的和為素數:3+7+19=293+7+19=293+7+19=29。
輸入格式
第一行兩個空格隔開的整數 n,kn,kn,k(1≤n≤201 \le n \le 201≤n≤20,k<nk<nk<n)。
第二行 nnn 個整數,分別為 x1,x2,??,xnx_1,x_2,\cdots,x_nx1?,x2?,?,xn?(1≤xi≤5×1061 \le x_i \le 5\times 10^61≤xi?≤5×106)。
輸出格式
輸出一個整數,表示種類數。
輸入輸出樣例 #1
輸入 #1
4 3
3 7 12 19
輸出 #1
1
說明/提示
【題目來源】
NOIP 2002 普及組第二題
本題在前面,已經用好幾種方法做過了。這里,用遞歸的方式來做。
#include<cstdio>
#include<vector>
using namespace std;
int n,k;
vector<int> a;
int cnt;
bool isPrime(int sum)
{if(sum<=1) return false;for(int i=2;i*i<=sum;++i){if(sum%i==0)return false;}return true;} void dfs(int u,int cnt_n,int sum){if(cnt_n==k){if(isPrime(sum))cnt++;return ;}if(u==n) return;dfs(u+1,cnt_n+1,sum+a[u]);dfs(u+1,cnt_n,sum);} int main(){scanf("%d%d",&n,&k);a.resize(n);for(int i=0;i<n;++i)scanf("%d",&a[i]);cnt=0; dfs(0,0,0);printf("%d\n",cnt);return 0;}
if(u==n) return; 這一句話,很重要。