洛谷P1036-选数(DFS)

简介: 洛谷P1036-选数(DFS)

题目描述:


已知 nnn 个整数 x1,x2,…,xnx_1,x_2,…,x_nx1,x2,…,xn,以及111个整数kkk(k<nk<nk<n)。从nnn个整数中任选kkk个整数相加,可分别得到一系列的和。例如当n=4,k=3n=4,k=3n=4,k=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≤20,k<n1 \le n \le 20,k<n1≤n≤20,k<n)


x1,x2,…,xn(1≤xi≤5000000)x_1,x_2,…,x_n (1 \le x_i \le 5000000)x1,x2,…,xn(1≤xi≤5000000)


输出:


屏幕输出,格式为: 111个整数(满足条件的种数)。


样例输入:


4 3

3 7 12 19


样例输出:


1


程序代码:



#include<bits/stdc++.h>
using namespace std;
int n,k,a[50],ans; 
bool prime(int x)
{
  for(int i=2;i<=sqrt(x);i++)
  {
    if(x%i==0)
      return false;
  }
  return true;
}
void dfs(int m,int sum,int find)
{//m代表选了几个数,sum代表当前的和,find以免算重 
  if(m==k)
  {
    if(prime(sum))//如果和是素数 
      ans++;
    return ;
  }
  for(int i=find;i<n;i++)
    dfs(m+1,sum+a[i],i+1);//步数m加1,和也要累加,起始值i+1以免算重 
  return ;
}
int main()
{
  scanf("%d %d",&n,&k);
  for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
  dfs(0,0,0);
  printf("%d\n",ans);
  return 0;
}


相关文章
|
算法 定位技术
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(7)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(7)
104 0
|
机器学习/深度学习
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
101 0
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(2)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(2)
64 0
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(1)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(1)
72 0
|
安全 算法
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(6)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(6)
106 0
|
算法
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(4)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(4)
100 0
|
算法
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(10)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(10)
122 0
|
算法
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(1)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(1)
124 0
|
算法 BI
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(5)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(5)
108 0
|
算法
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(9)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(9)
92 0