【简单递归】

题目描述

已知 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 3

3 7 12 19

样例输出

1

代码

#include <iostream>
#include <cstring>
#include <vector>
using namespace std; //判断是否是素数
bool isprime(int n)
{
if (n<1)return false;
for (int i=2;i*i<n;i++)
{
if (n%i==0)//n&(i-1)==0
return false;
}
return true;
}
int a[22],p[22], b[22];
bool vis[22];
int n, k, sum, ans;
int cnt = 0;
vector<vector<int> > index_vec;
vector<int> sum_vec;
void dfs(int index)
{
cout << "Enter dfs, " << ++cnt << "th" << ", index:" << index << ", p[index-1]:" << p[index-1] << endl;
if (index==k+1)
{
if (isprime(sum))
{
ans++;
cout << "sum:" << sum << " is prime." << endl;
} //打印每一个元素组合
vector<int> v;
for (int i=1;i<=index-1;i++)
{
cout << p[i] << " ";
v.push_back(p[i]); }
index_vec.push_back(v);
sum_vec.push_back(sum);
cout << endl;
cout << "sum:" << sum << endl;
return;
} //遍历n个数
for (int i=1;i<=n;i++)
{
//条件1:该元素在本次遍历中是否被访问过
//条件2:保障遍历的i下标大于已统计过的最后一个元素下标 cout << "i:" << i << ", vis:" << vis[i] << ", index:" << index << ", p[index-1]:" << p[index-1] << endl;
if (vis[i]==false && i>p[index-1])
{
p[index] = i;//数组p用来保存元素下标,index为当前统计的元素总数目
vis[i] = true;//标记该元素已被该次计算统计过
sum += a[i];//更新和,在全排列过程中,对结果进行统计 cout << "Enter the next dfs" << endl;
cout << "sum:" << sum << ", i:" << i << ", vis[i]:" << vis[i] << endl; dfs(index+1);//开始下一次递归计算 cout << "return from dfs" << endl; //回溯
vis[i] = false;
sum -= a[i]; cout << "sum:" << sum << ", i:" << i << ", vis[i]:" << vis[i] << ", index:" << index << ", p[index-1]:" << p[index-1] << endl; }
}
} int main()
{
//初始化全局变量
memset(b, 0, sizeof(b));
memset(vis, false, sizeof(vis)); //获取输入
cin >> n >> k;
cout << "n=" << n << " ,k=" << k << endl;
for (int i=1; i<=n;i++)
{
cin >> a[i];
p[i]=i;
} ans = 0;
dfs(1); cout << ans << endl;
int seq=0;
for (auto it: sum_vec)
{
cout << "sum: " << it << endl;
for (auto it_idx: index_vec[seq])
{
cout << it_idx << " ";
}
cout << endl;
++seq;
} return 0;
}

题目解析

循环中调用递归

代码打印帮助理解递归过程

4
3
n=4 ,k=3
3
7
12
19 Enter dfs, 1th, index:1, p[index-1]:0
i:1, vis:0, index:1, p[index-1]:0
Enter the next dfs
sum:3, i:1, vis[i]:1
Enter dfs, 2th, index:2, p[index-1]:1
i:1, vis:1, index:2, p[index-1]:1
i:2, vis:0, index:2, p[index-1]:1
Enter the next dfs
sum:10, i:2, vis[i]:1
Enter dfs, 3th, index:3, p[index-1]:2
i:1, vis:1, index:3, p[index-1]:2
i:2, vis:1, index:3, p[index-1]:2
i:3, vis:0, index:3, p[index-1]:2
Enter the next dfs
sum:22, i:3, vis[i]:1
Enter dfs, 4th, index:4, p[index-1]:3
1 2 3
sum:22
return from dfs
sum:10, i:3, vis[i]:0, index:3, p[index-1]:2
i:4, vis:0, index:3, p[index-1]:2
Enter the next dfs
sum:29, i:4, vis[i]:1
Enter dfs, 5th, index:4, p[index-1]:4
sum:29 is prime.
1 2 4
sum:29
return from dfs
sum:10, i:4, vis[i]:0, index:3, p[index-1]:2
return from dfs
sum:3, i:2, vis[i]:0, index:2, p[index-1]:1
i:3, vis:0, index:2, p[index-1]:1
Enter the next dfs
sum:15, i:3, vis[i]:1
Enter dfs, 6th, index:3, p[index-1]:3
i:1, vis:1, index:3, p[index-1]:3
i:2, vis:0, index:3, p[index-1]:3
i:3, vis:1, index:3, p[index-1]:3
i:4, vis:0, index:3, p[index-1]:3
Enter the next dfs
sum:34, i:4, vis[i]:1
Enter dfs, 7th, index:4, p[index-1]:4
1 3 4
sum:34
return from dfs
sum:15, i:4, vis[i]:0, index:3, p[index-1]:3
return from dfs
sum:3, i:3, vis[i]:0, index:2, p[index-1]:1
i:4, vis:0, index:2, p[index-1]:1
Enter the next dfs
sum:22, i:4, vis[i]:1
Enter dfs, 8th, index:3, p[index-1]:4
i:1, vis:1, index:3, p[index-1]:4
i:2, vis:0, index:3, p[index-1]:4
i:3, vis:0, index:3, p[index-1]:4
i:4, vis:1, index:3, p[index-1]:4
return from dfs
sum:3, i:4, vis[i]:0, index:2, p[index-1]:1
return from dfs
sum:0, i:1, vis[i]:0, index:1, p[index-1]:0
i:2, vis:0, index:1, p[index-1]:0
Enter the next dfs
sum:7, i:2, vis[i]:1
Enter dfs, 9th, index:2, p[index-1]:2
i:1, vis:0, index:2, p[index-1]:2
i:2, vis:1, index:2, p[index-1]:2
i:3, vis:0, index:2, p[index-1]:2
Enter the next dfs
sum:19, i:3, vis[i]:1
Enter dfs, 10th, index:3, p[index-1]:3
i:1, vis:0, index:3, p[index-1]:3
i:2, vis:1, index:3, p[index-1]:3
i:3, vis:1, index:3, p[index-1]:3
i:4, vis:0, index:3, p[index-1]:3
Enter the next dfs
sum:38, i:4, vis[i]:1
Enter dfs, 11th, index:4, p[index-1]:4
2 3 4
sum:38
return from dfs
sum:19, i:4, vis[i]:0, index:3, p[index-1]:3
return from dfs
sum:7, i:3, vis[i]:0, index:2, p[index-1]:2
i:4, vis:0, index:2, p[index-1]:2
Enter the next dfs
sum:26, i:4, vis[i]:1
Enter dfs, 12th, index:3, p[index-1]:4
i:1, vis:0, index:3, p[index-1]:4
i:2, vis:1, index:3, p[index-1]:4
i:3, vis:0, index:3, p[index-1]:4
i:4, vis:1, index:3, p[index-1]:4
return from dfs
sum:7, i:4, vis[i]:0, index:2, p[index-1]:2
return from dfs
sum:0, i:2, vis[i]:0, index:1, p[index-1]:0
i:3, vis:0, index:1, p[index-1]:0
Enter the next dfs
sum:12, i:3, vis[i]:1
Enter dfs, 13th, index:2, p[index-1]:3
i:1, vis:0, index:2, p[index-1]:3
i:2, vis:0, index:2, p[index-1]:3
i:3, vis:1, index:2, p[index-1]:3
i:4, vis:0, index:2, p[index-1]:3
Enter the next dfs
sum:31, i:4, vis[i]:1
Enter dfs, 14th, index:3, p[index-1]:4
i:1, vis:0, index:3, p[index-1]:4
i:2, vis:0, index:3, p[index-1]:4
i:3, vis:1, index:3, p[index-1]:4
i:4, vis:1, index:3, p[index-1]:4
return from dfs
sum:12, i:4, vis[i]:0, index:2, p[index-1]:3
return from dfs
sum:0, i:3, vis[i]:0, index:1, p[index-1]:0
i:4, vis:0, index:1, p[index-1]:0
Enter the next dfs
sum:19, i:4, vis[i]:1
Enter dfs, 15th, index:2, p[index-1]:4
i:1, vis:0, index:2, p[index-1]:4
i:2, vis:0, index:2, p[index-1]:4
i:3, vis:0, index:2, p[index-1]:4
i:4, vis:1, index:2, p[index-1]:4
return from dfs
sum:0, i:4, vis[i]:0, index:1, p[index-1]:0
1
sum: 22
1 2 3
sum: 29
1 2 4
sum: 34
1 3 4
sum: 38
2 3 4 Process finished with exit code 0

DFS-递归入门的更多相关文章

  1. POJ 1321-棋盘问题(DFS 递归)

    POJ 1321-棋盘问题 K - DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I6 ...

  2. 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)

    邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...

  3. Timus 1329. Galactic History。LCA最近公共祖先或dfs递归离线处理!

    1329. Galactic History 比赛的时候看到学弟A了这题然后跟榜做,结果在LCA的道路上一去不复返,这个题是很像LCA求最近公共祖先的,不过三个人都没学过LCA,只能拿着资料看着像然后 ...

  4. 【递归入门】组合的输出:dfs

    题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r < = n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. 现要求你不用递归的方 ...

  5. 【递归入门】组合+判断素数:dfs(递归)

    题目描述 已知 n 个整数b1,b2,…,bn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和. 例如当 n=4,k=3,4 个整数分别为 3,7,12, ...

  6. [LeetCode] Combinations (bfs bad、dfs 递归 accept)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  7. 图的DFS递归和非递归

    看以前写的文章: 图的BFS:http://www.cnblogs.com/youxin/p/3284016.html DFS:http://www.cnblogs.com/youxin/archiv ...

  8. 深度优先搜索(DFS)递归形式改为非递归形式

    DFS将递归改为非递归这个方法的需求来自于一道三维积木组合的题目,还在苦苦调试中,暂且不提. 普通的认识对于递归向非递归的转化无非是使用栈,但是结合到深度搜索如何将栈很好利用,如何很好保存现场,都不是 ...

  9. 八皇后问题 dfs/递归

    #include <bits/stdc++.h> using namespace std; const int maxn = 55; int ans=0; int vis_Q[maxn]; ...

  10. (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree

    Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longe ...

随机推荐

  1. C#控制台打开VM虚拟机

    添加引用->VixCOM.dll (在vix文件夹下) VixWrapper.cs using System; using System.Collections.Generic; using S ...

  2. Git的使用和配置小白必看都是干货,为您解惑

    Git安装 首先下载git这个软件,然后打开码云新建仓库 在本地选择一个路径作为本地仓库 点新建仓库然后输入邮箱和密码,然后进行配置 在要作为本地仓库的地方新建一个文件夹,保存后关闭,在文件夹空白处鼠 ...

  3. C#2.0新增功能07 getter/setter 单独可访问性

    连载目录    [已更新最新开发文章,点击查看详细] 属性是一种成员,它提供灵活的机制来读取.写入或计算私有字段的值. 属性可用作公共数据成员,但它们实际上是称为访问器的特殊方法. 这使得可以轻松访问 ...

  4. 以for循环的方式了解var与let的区别

    var是ES5定义变量的一种声明方式. let是ES6定义变量的一种声明方式---可定义局部变量,即定义块级作用域. 以下列简单的函数进行表现二者作用域的不同 在ES6之前,我们都是用var来声明变量 ...

  5. python模块导入-软件开发目录规范-01

    模块 模块的基本概念 模块: # 一系列功能的结合体 模块的三种来源 """ 模块的三种来源 1.python解释器内置的模块(os.sys....) 2.第三方的别人写 ...

  6. 解密Kafka吞吐量高的原因

    众所周知kafka的吞吐量比一般的消息队列要高,号称the fastest,那他是如何做到的,让我们从以下几个方面分析一下原因. 生产者(写入数据) 生产者(producer)是负责向Kafka提交数 ...

  7. PHPStrom激活方法【亲测有效2018.4.23】

    直接用浏览器打开 http://idea.lanyus.com/ 点击页面中的"获得注册码", 然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串 ...

  8. javascript基本特点,组成和应用

    JavaScript 是一种基于客户端浏览器.面向(基于)对象和事件驱动式的网页脚本语言. 1. 基于客户端浏览器:静态语言,跨平台: 2. 面向(基于)对象:本身是没有类class和对象这个概念,但 ...

  9. 【iOS】CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable

    CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SH ...

  10. [Chat]实战:仿网易云课堂微信小程序开发核心技术剖析和经验分享

    本Chat以一个我参与开发并已上线运营近2年——类似网易云课堂的微信小程序项目,来进行微信小程序高级开发的学习. 本场Chat围绕项目开发核心技术分析,帮助你快速掌握在线视频.音频类小程序开发所需要的 ...