博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeup 算法笔记【递归入门】组合+判断素数
阅读量:4538 次
发布时间:2019-06-08

本文共 1269 字,大约阅读时间需要 4 分钟。

问题 C: 【递归入门】组合+判断素数

时间限制: 1 Sec  内存限制: 128 MB

提交: 205  解决: 77
[][][][命题人:外部导入]

题目描述

已知 n 个整数b1,b2,…,bn

以及一个整数 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<=n<=20,k<n) 

第二行n个整数:x1,x2,…,xn (1<=xi<=5000000) 

输出

一个整数(满足条件的方案数)。 

样例输入

4 33 7 12 19

样例输出

1

 

#include
#include
using namespace std;bool isprime(int n){ if (n<=1) return false; for (int i=2;i*i<=n;i++) if (n%i==0) return false; return true;}//判断素数 int a[22];int b[22];int p[22]; bool vis[22];int n,k,sum,ans;void dfs(int index){ if (index==k+1) { if (isprime(sum)) ans++;//看是否加起来是素数 for (int i=1;i<=index-1;i++) cout<
<<" "; cout<
p[index-1])//保证这个排列是按顺序来的,避免重复计算导致答案错误 { p[index] = i; vis[i] = true; sum+=a[i];//最巧妙的地方,,利用全排列的排列过程中,来加上我输入的数字 dfs(index+1); vis[i] = false; sum-=a[i];//有加就有减 } }}int main(){ memset(b,0,sizeof(b)); memset(vis,0,sizeof(vis)); cin>>n>>k; for (int i=1;i<=n;i++) cin>>a[i],p[i]=i;//一开始要从第一个排列填好 才开始遍历 ,这与传统的dfs全排列做了点变化 ans=0; dfs(1); cout<
<

 

转载于:https://www.cnblogs.com/Romantic-Chopin/p/10253150.html

你可能感兴趣的文章
python3之正则表达式
查看>>
Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
查看>>
Java 时间总结
查看>>
jQuery EasyUI 拖放 – 基本的拖动和放置
查看>>
这些年正Android - 母亲
查看>>
[工具] BurpSuite--XssValidator插件
查看>>
LPC1788系统时钟初始化
查看>>
channel vs mutex
查看>>
页面布局(--FlowLayout,--BorderLayout,--GridLayout)
查看>>
实验吧--web--你真的会php吗
查看>>
vue组件化学习第二天
查看>>
网络枚举工具推荐
查看>>
003LeetCode--LongestSubstring
查看>>
quarzt(官方)---给自己看的文档(SchedulerListeners)-8
查看>>
Linux-慕课网学习笔记-3-1命令格式
查看>>
AJAX入门介绍
查看>>
[算法竞赛入门]第一章_算法概述
查看>>
SQL反模式笔记3——主键规范
查看>>
简单粗暴,微生物生态研究中常用数据库简介--转载
查看>>
Oracle -操作数据库
查看>>