博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
p1036 选数(不详细勿看,递归)
阅读量:5943 次
发布时间:2019-06-19

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

题目:

这题,不会做,而且看了好久才看懂题解的,然后在题解的基础上补了一个

if(start>end) return 0 感觉这样对于我更直观

转载自:

先声明,我代码全部抄他的,原创是他

 

解释一下他的思路吧

就是比如说输入数字3 7 12 19,从中选三个

那么先要递归全排列再判断素数,主要是递归全排列难

他这里递归的直接就是答案的值,全部算完之后第一次调用函数的返回值就是答案

 

刚刚说到3 7 12 19

然后第一个可能选3或7或12或19这四种(这四种待会还会递归展开)

然后比如说第一次选了3,第二次就可能选7或12或19

比如说第一次选了12,第二次就可能选19,第三次时已经选了2次,还没到第三次,这时候再递归,start就会>end,就会return 0,通俗来说就是第二次选19本来就没意义,迟早要让他return 0,因为第二次选19,接下来就没得选了

如此一来就在没有重复的情况下完成了全排列那些全排列中畸形残缺的都被淘汰了

代码:

#include
#include
using namespace std;int x[20],n,k;//依照题目所设bool isprime(int n){
//判断是否质数 int s=sqrt(double(n)); for(int i=2;i<=s;i++){ if(n%i==0)return false; } return true;}int rule(int choose_left_num,int already_sum,int start,int end){
//choose_left_num为剩余的k,already_sum为前面累加的和,start和end为全组合剩下数字的选取范围;调用递归生成全组合,在过程中逐渐把K个数相加,当选取的数个数为0时,直接返回前面的累加和是否为质数即可 if(choose_left_num==0)return isprime(already_sum); if(start>end)return 0;//这一行是我自己加上去的 int sum=0; for(int i=start;i<=end;i++){ sum+=rule(choose_left_num-1,already_sum+x[i],i+1,end); } return sum;}int main(){ cin>>n>>k; for(int i =0;i
>x[i]; cout<

 

转载于:https://www.cnblogs.com/zyacmer/p/10088023.html

你可能感兴趣的文章
移动互联
查看>>
basic4android 开发教程翻译(三)IDE 小贴士
查看>>
看看async,await 是如何简化异步的调用WCF!
查看>>
obj-c 定义一个类
查看>>
电脑APK
查看>>
计数器的代码的原理分析
查看>>
HDU-4335 What is N? 欧拉函数,欧拉定理
查看>>
HDU 1044 Collect More Jewels(搜索,先bfs再dfs)
查看>>
使用RabbitMQ过程中遇到的一个问题(队列为空,但内存暴涨)以及与开发者的邮件沟通...
查看>>
C++/C学习笔记(九)
查看>>
ASP.net MVC 中Security.FormsAuthentication验证用户的状态(匿名|已登录)
查看>>
《C++ Primer》 Part III(Classes and Data Abstraction)
查看>>
FriendlyUrls——在ASP.NET Web表单中使用更友好的URL
查看>>
NodeJs新手学习笔记之工具准备
查看>>
SQL ExecuteNonQuery()的返回值
查看>>
【函数】strcpy源代码
查看>>
【javascript】字符串对象常用 api
查看>>
对PostgreSQL中 index only scan 的初步理解
查看>>
poj 2337 Catenyms
查看>>
PypeR
查看>>