2.1最基本的“穷竭搜索”--Day2

2.1.3 队列

1.简介:
队列(queue)是与栈一样的数据结构,可以push和pop,也可以取出元素(front),但与栈不同的是,队列是先进先出(FIFO)(First In First Out),也就是说,最先放入的元素最先取出。
2.具体操作:

#include<cstdio>
#include<queue>

using namespace std;

int main(){
	queue<int> q;
	q.push(1);//添加元素
	q.push(3);
	q.push(1);
	q.push(4);
	printf("%d\n",q.front());//1--拿出最先放入的元素
	q.pop();//移除最先放入的元素
	printf("%d\n",q.front());//3
	q.pop();
	printf("%d\n",q.front());//1
	q.pop();
	printf("%d\n",q.front());//4
	q.pop();
	return 0;
}

深度优先搜索(DFS)

1.介绍:
深度搜索就是将一个步骤的所有选项列出,然后接着往下走,给人的感觉就是树状图。
这是本书的解释:从某一个状态开始,不断的转移状态直到无法转移,然后退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终解。
建议用题目理解。
2.题目:
在这里插入图片描述
给定n个整数,判断是否能凑出数值为k的和。
在这里插入图片描述

在这里插入图片描述
看上图,上图显示了此题的原理。我们按一个一个数的顺序来加,每个数给两个状态,加或不加,这样我们就能像树状图一样把所有和的可能列出来了(总共有2的n次方种)。
从上图可以看出,每一次递归有两个参数,一个是项数i,另一个是和sum,而每一次递归,i 必然加1,那么递归函数会有三种不一样的状态,第一种是sum=k,退出递归;第二种是sum不为k,进行下一次递归但不加下一项;第三种是sum不为k进行下一次递归但加下一项。当然,列出这些选择后还要再加上一个return false;万一最后递归着递归着没有凑到k,我们就只能返回false了。这样一直递归,最后函数不是返回sum=k时的true就是最后的false。

#include<bits/stdc++.h>

using namespace std;

	int n;
	int k;
	int a[21];
	
bool dfs(int i,int sum){
	if(i==n)
	return sum==k;
//如果前n项都计算过了,就返回sum与k是否相等
	if(dfs(i+1,sum))
	return true;
//不加a[i]的情况
	if(dfs(i+1,sum+a[i]))
	return true;
//加a[i]的情况
	return false;
//无论是否加上都凑不出则返回a[i]
}


int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>k;
	bool bl=dfs(-1,0);
	if(bl==true)
	cout<<"Yes";
	else
	cout<<"No";
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值