tips:
0.递归用来搜索;递归用来分治---(基于快速幂的思考,子问题的处理);递和归;快速幂的递归写法,快速幂的迭代写法。之前写的递归总结
1.深度优先搜索:
枚举所有完整路径以遍历所有情况的搜索方法(所有方案数,在根据条件排除一些方案---剪枝)---集合论的角度
2.书中例子:走迷宫---“岔道口”、“死胡同”,“岔道口”---等到函数返回到这一层,再尝试其他岔路
3.01背包搜索解法(联系1中路径的感觉,dfs函数参数的设计)
4.剪枝:通过题目条件限制来节省dfs计算量的方法叫剪枝
5.优先队列与排序中自定义排序规则的写法和区别。
#include<iostream> using namespace std; const int maxn=1010; int n,W,maxValue=0; int w[maxn],v[maxn]; //题目中涉及了物品的重量和价值,因此也需要参数来记录在处理当前物品之前, //已选物品的总重量sumW和总价值sumV void dfs(int index, int sumW, int sumV){ if(index==n){ if(sumW<=W && sumV > maxValue){ maxValue=sumV; } return; } dfs(index+1, sumW, sumV); //选第i间物品 dfs(index+1,sumW+w[index],sumV+v[index]); } int main(){ cin>>n>>W; for(int i=0;i<n;i++){ cin>>w[i]>>v[i]; } dfs(0,0,0); cout<<maxValue<<endl; return 0; }01背包搜索解法
#include<iostream> using namespace std; const int maxn=1010; int n,W,maxValue=0; int w[maxn],v[maxn]; void dfs(int index, int sumW, int sumV){ if(index==n){ // if(sumW<=W && sumV > maxValue){ // maxValue=sumV; // } return; } dfs(index+1, sumW, sumV); //选第i件物品 if(sumW+w[index]<= W){ if(sumV+v[index]> maxValue){ maxValue = sumV+v[index]; } dfs(index+1,sumW+w[index],sumV+v[index]); } } int main(){ cin>>n>>W; for(int i=0;i<n;i++){ cin>>w[i]>>v[i]; } dfs(0,0,0); cout<<maxValue<<endl; return 0; }01背包递归优化版
sum:
1.算法书要常读常新。
2.看书中作者的表达看出思考问题的思路