洛谷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;
}


相关文章
|
6月前
【每日一题Day245】面试题 16.19. 水域大小 | dfs
【每日一题Day245】面试题 16.19. 水域大小 | dfs
42 0
|
算法
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(3)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(3)
108 0
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(2)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(2)
58 0
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(1)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(1)
68 0
|
机器学习/深度学习
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
93 0
|
算法
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(9)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(9)
86 0
|
算法
从三道leetcode掌握深度优先搜索(DFS)
前言 无论在算法面试还是刷题中,深度优先搜索(DFS)和广度优先搜索(BFS)都是一个绕不过去的坎。不同于数组的从左至右遍历,循环常用于一维数据结构的遍历。而DFS和BFS则常用于多维数据结构的遍历,最常见的莫过于嵌套结构的多叉树了。
|
机器学习/深度学习 算法
算法每日一题:P2089 烤鸡 -DFS练习
算法每日一题:P2089 烤鸡 -DFS练习
|
算法 JavaScript
好的,DFS,也学废了!
没错,本篇是上一篇《好的,BFS,又学废了!》的姊妹篇,意在通过简单回顾拾起学了忘、又忘了学的基础数据结构; DFS,全称是:深度优先遍历(Depth_First_Search),通常和 BFS 广度优先遍历(Breadth-first search)对比理解学习;
八皇后(dfs全排列)
八皇后(dfs全排列)
82 0