概述
递归就相当于遍历树,而常见的遍历二叉树,也就是DFS(深度遍历)
适用问题
1.具有目标函数和约束条件
2.求最大最小问题
模型分析
模板
头文件
变量定义:涉及到递归用到的都用全局变量
void dfs(int 本次循环直接影响的变量,...,int index(当前层数)){
if(index==n(最大层数)){//当前层数等于总层数:这个固定不变,因为是在算完这条路线的所有结点之后才去判断
if(变量大小限制 && 约束条件){
更新目标函数
}
return;//因为达到最大层数所以返回
}
//分叉口,选或者不选(几叉树就有几个,这里二叉)
dfs(sumz+w[index+1],sumc+c[index+1],index+1);//注意加1
dfs(sumz,sumc,index+1);
}
int main(){
输入数据,注意数组从0开始
dfs(变量初始化,...,当前层次=0); //注意当前层次必须为0
printf("%d",y); //输出目标函数
return 0;
}
参考例题
网址:https://blog.csdn.net/qq_43808611/article/details/108150347
代码
#include <bits/stdc++.h>
using namespace std;
//*变量定义:**涉及到递归用到的都用全局变量
//重物数量、背包体积、总重量,总价格 ,最大价格 ,层数
int n,v,sumz=0,sumc=0,maxc=0,index=1;
int w[100];int c[100];
//递归算法
void dfs(int sumz,int sumc,int index){//*本次循环中直接影响的变量和层数
//达到最大层数退出
if(index==n){//*当前层数等于总层数:这个固定不变,因为是在算完这条路线的所有结点之后才去判断
//价钱最大并且重量小于背包体积
if(sumc>maxc && sumz<=v){ // 约束条件+变量大小限制
maxc=sumc;//更新目标函数
}
return;
}
//分叉口,选或者不选
dfs(sumz+w[index+1],sumc+c[index+1],index+1);
dfs(sumz,sumc,index+1);
}
int main(){
//输入重量价格,重物数量、背包体积
scanf("%d",&n);
scanf("%d",&v);
for(int i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&c[i]);
}
dfs(0,0,0);
printf("\n我%d",maxc);
return 0;
}