DFS入门题—乘积和问题

这篇博客介绍了如何使用深度优先搜索(DFS)解决一个数学问题:给定N个正整数,找出所有可能的K个数的乘积,计算这些乘积和为素数的情况数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度优先搜索是从某个状态开始不断转移状态过程直至无法继续转移,则回退到上一状态继续重复直至枚举完所有的情况。所谓深度即是开始一通到底,然后通过递归出口回退到上一个状态。


给你N个正整数,求出这N个正整数中所有任选K个数相乘后所有乘积的和。

#include<iostream>
using namespace std;
int n, k;
int a[100];
int RES = 0;                          //因为不需要打表记录,不需要标记回溯!
void dfs(int num, int sum, int res)
{
	if (sum == k)                 //递归出口之一:任选个数达到K个
	{
		RES += res;
		return;
	}
	if (num > n)                  //递归出口之二:当前已经超过了N个数无法继续选择
		return;
	dfs(num + 1, sum + 1, res*a[num]);    //该数被选上了
	dfs(num + 1, sum, res);               //该数没有被选上
}
int main()
{
	cin >> n >> k;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	dfs(0, 0, 1);
	cout << RES << endl;
	system("pause");
	return 0;
}
已知 n 个整数 x1,x2,…,xn,以及一个整数 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。

现在,要求你计算出和为素数共有多少种。

#include<iostream>
#include<cmath>
using namespace std;
int n, k, a[50];
int ans = 0;
bool prime(int t)
{
	for (int i = 2; i <= sqrt(t); i++)
	{
		if (t%i == 0)
			return false;
	}
	return true;
}
void dfs(int num, int sum, int res)
{
	if (sum == k)                              //递归出口之一
	{
		if (prime(res))                    //按要求判断,符合则计数加一
			ans++;
		return;
	}
	if (num>n)                                 //递归出口之二
		return;
	dfs(num + 1, sum + 1, res + a[num]);       //该数被选上
	dfs(num + 1, sum, res);                    //该数没有被选上
}
int main()
{
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	dfs(1, 0, 0);                             //从第一个数开始,初始已选个数为零,总和为零
	cout << ans << endl;
	return 0;
}

### DFS BFS 算法入门教程 #### 深度优先搜索 (DFS) 深度优先搜索是一种用于遍历或搜索树或图的算法。该方法尝试深入子节点直到达到叶子节点,之后再回溯并继续访问其他分支。 - **工作原理** - 开始于根节点(选择某个任意节点作为起始点),然后尽可能深地沿着每个分支进行探索。 - 当遇到无法前进的情况时,则返回上一步,并重复此过程直至所有相邻顶点都被访问过为止[^1]。 - **特点** - 使用栈来保存待处理结点列表;可以递归实现也可以非递归方式完成。 - 对于连通性检测非常有效率,在迷宫求解等问题中有广泛应用。 ```python def dfs(graph, start): visited = set() def helper(node): if node not in visited: print(f'Visiting {node}') visited.add(node) for neighbour in graph[node]: helper(neighbour) helper(start) ``` #### 广度优先搜索 (BFS) 广度优先搜索也是一种用来遍历或查找图形数据结构的方法。它按照层次顺序依次访问每一个节点——先访问离起点最近的一层邻居们,然后再去更远的地方。 - **工作原理** - 初始化队列并将初始位置加入其中; - 取出当前队首元素作为正在考察的对象,将其未被标记过的邻接点全部入队; - 继续上述操作直到队为空或者找到了所需的目标项[^2]。 - **特性** - 利用先进先出(FIFO)原则管理要检查的位置集合; - 能够发现无权图中最短路径长度,即最少边数连接两点之间的路线。 ```python from collections import deque def bfs(graph, start): queue = deque([start]) visited = {start} while queue: vertex = queue.popleft() print(f'Visiting {vertex}') for neighbor in graph[vertex]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) ``` 这两种算法都可用于解决许多不同类型的问题,但在具体应用场景下各有优劣。例如,在寻找最短路径方面,通常推荐使用BFS而不是DFS,因为前者能保证找到的是具有最小跳转次数的结果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值