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;
}