【蓝桥】算法笔记DFS例题1----背包最大值

题目

有n件物品每件物品的重量w[i],价值c[i]。现在要选择若干个物品放入一个容量为V的背包,使得在选入背包的物品重量和不超过容量V的前提下,让背包中物品之和的价格最大,求最大值?

分析过程

DFS使用情况

枚举从n(已知)中选择k(未知)个的所有方案

代码

//因为不确定件数,所以不能用枚举 
//DFS适用于在确定for的层数(实际不确定)时可用枚举的情况下 
#include 
using namespace std;

const int maxn=30; //加const的作用是将其设置为常数,如果不加后面还可以重新定义,而且定义数组必须用const定义为常数 
int w[maxn];//每件物品重量 
int c[maxn];//每件物品价格
int n;//物品数
int index;//物品序号 
int sumW,sumC;//总重量和总价格
int maxC;//最大价格
int V;//最大容量 

/*
深度优先搜索算法  
*/ 
void DFS(int index,int sumW,int sumC){
     
	if(index==n){
     
		if(sumW<=V && sumC>maxC){
     
			maxC=sumC;
		}
		return;
	} 
	DFS(index+1,sumW,sumC);//不选择该序号的物品
	DFS(index+1,sumW+w[index+1],sumC+c[index+1]);
} 
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]);
	}

	DFS(0,0,0); //传入初始序号、总重量和总价格
	printf("最大价格:%d",maxC); 
	return 0;
}


注意事项

  • const
    用于定义常量
    常用于定义常量后,在定义常量对应的数组

  • return;
    跳出当前viod函数

  • 函数定义
    【蓝桥】算法笔记DFS例题1----背包最大值_第1张图片

优化

  • 上述代码时间复杂度
    有n个物品每个物品有2个选择
    上面代码的时间复杂是O(2的n次方)
  • 优化方法
    其中在大于背包体积的时候还在进行,直到n个全部枚举完毕,可以在大于背包体积的时候停止本轮运行情况
  • 优化代码
void DFS(int index,int sumW,int sumC){
     
	if(index==n){
     
		
		return;
	} 
	DFS(index+1,sumW,sumC);//不选择该序号的物品
	if(sumW+w[index+1]<=V){
     
		DFS(index+1,sumW+w[index+1],sumC+c[index+1]);
		if(sumC+c[index+1]>maxC){
     
			maxC=sumC;
		} 	
	}
} 

参看《算法笔记》271页

你可能感兴趣的:(蓝桥,算法)