深度优先搜索
碰到岔路口就递归,碰到死胡同就是递归边界
例子:
背包问题:n个物品,每件重量给了,价值给了,不超重的前提下,怎么拿更值钱。
思路:首先参数:当前在哪一号物品上,然后,当前的价值,当前的重量。
//先想一想思路:如果东西只有一件,那么价值就是他本身,如果东西有多件
//那么就可以选择选这件东西,或者不选这件东西,当到死胡同,判断是否更新最大值
#include<cstdio>
int n,v;//放总共有多少个物品和背包总共可以放多沉
int maxvalue=0;
int w[25],c[25];
int beg (int index,int value,int weight){
if(index==n){
if(value>maxvalue && weight<=v) maxvalue=value;//到达底部并且不超出背包范围,才要更新
return; //只需要返回,不需要返回值
}
beg(index+1,value,weight);//不选index号
beg(index+1,value+c[index],weight+w[index]);//选index号,因为index滞后一个位,所以添加重量时不加一
}
但是可以改进一下,因为第二条路没有判断是不是超出了重量就进去了,这种思路就叫做剪枝
//先想一想思路:如果东西只有一件,那么价值就是他本身,如果东西有多件
//那么就可以选择选这件东西,或者不选这件东西,当到死胡同,判断是否更新最大值
#include<cstdio>
#include<cstdlib>
int n,v;//放总共有多少个物品和背包总共可以放多沉
int maxvalue;
int w[25],c[25];
void beg (int index,int value,int weight){
if(index==n){
return; //只需要返回,不需要返回值
}
beg(index+1,value,weight);//不选index号
if(weight+w[index]<=v){
//只有选了才有可能更新最大值
if(value+c[index]>maxvalue) maxvalue=value+c[index];///到达底部并且不超出背包范围,才要更新
beg(index+1,value+c[index],weight+w[index]);//选index号,因为index滞后一个位,所以添加重量时不加一
}
}
int main(){
scanf("%d%d",&n,&v);
for(int i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&c[i]);
}
beg(0,0,0);
printf("%d\n",maxvalue);
system("pause");
return 0;
}
这有个问题就是如何保存我们选到的方案
还是更新的思路,所以有一个临时的数组先放着,当价值确实更大的时候,更新给结果数组,为了方便插入删除和赋值,用vector
//先想一想思路:如果东西只有一件,那么价值就是他本身,如果东西有多件
//那么就可以选择选这件东西,或者不选这件东西,当到死胡同,判断是否更新最大值
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;
int n,v;//放总共有多少个物品和背包总共可以放多沉
int maxvalue;
int w[25],c[25];
vector<int> temp,ans;
void beg (int index,int value,int weight){
if(index==n){
return; //只需要返回,不需要返回值
}
beg(index+1,value,weight);//不选index号
if(weight+w[index]<=v){
//只有选了才有可能更新最大值
temp.push_back(index+1);
if(value+c[index]>maxvalue){
maxvalue=value+c[index];///到达底部并且不超出背包范围,才要更新
ans=temp;
}
beg(index+1,value+c[index],weight+w[index]);//选index号,因为index滞后一个位,所以添加重量时不加一
temp.pop_back();//为了不影响不放入的那条线,所以要用完了pop出来
}
}
int main(){
scanf("%d%d",&n,&v);
for(int i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(int i=0;i<n;i++){
scanf(