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

本文共 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/10253148.html

你可能感兴趣的文章
中小团队基于Docker的Devops实践
查看>>
利用python打开摄像头并保存
查看>>
System函数的使用说明
查看>>
Selenium-测试对象操作之:获取浏览器滚动条滚动距离
查看>>
Linux下MySQL数据库安装与配置
查看>>
Extjs String转Json
查看>>
oracle入门(4)——少而常用的命令
查看>>
打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机...
查看>>
Java 虚拟机部分面试题
查看>>
JS中 String/JSON 方法总结
查看>>
二叉树的遍历问题总结
查看>>
3.14-3.20周总结
查看>>
Spring之面向切面编程AOP
查看>>
MATLAB GUI程序设计中使文本框接收多行输入的方法
查看>>
全文检索-Elasticsearch (四) elasticsearch.net 客户端
查看>>
Oracle DBMS_SESSION
查看>>
sublime复制当前行到下一行
查看>>
WPF 3D变换应用
查看>>
luogu4012 深海机器人问题 网络流
查看>>
android 拍照上传照片
查看>>