0-1背包之递归法(DFS)

0-1背包实属经典问题,经典的解决方法有动态规划算法,我用简单易理解的递归解答,主要代码如下。

注意:对递归过程中不必要的代码进行剪枝提高效率。

//DFS 
//0-1背包,递归法 
const int bmaxn = 30;
	//背包容量,最大价值 
	int n,maxCapacity,maxValue = 0;
	int weight[bmaxn],value[bmaxn];
	
void bag(int index,int Vsum,int Wsum){
	if(index == n){ 
		//更新背包重量,递归结束条件 
		if(Wsum <= maxCapacity&&Vsum >= maxValue)
			maxValue = Vsum; 
		return; 
	}
	//找下一个物品,且不要 
	bag(index+1,Vsum,Wsum);
	//找下一个物品,要了 
	//为了提高算法效率,我们要过滤不必要的递归
	//不光没超重 
	if(Wsum + weight[index] <= maxCapacity){
		//还得增值才行,增值的话修改总值 
		if(maxValue < Vsum+value[index]){
			maxValue = Vsum + value[index];
		}
		bag(index+1,Vsum+value[index],Wsum+weight[index]);	
	}
}
//input 0-1 bag data 
void inputbag(){
	printf("输入物品数,背包容量:\n");
	scanf("%d%d",&n,&maxCapacity);
	printf("输入各物品重量:\n"); 
	for(int i = 0;i<n;i++){
		scanf("%d",&weight[i]);
	}
	printf("输入各物品价值:\n");
	for(int i = 0;i<n;i++){
		scanf("%d",&value[i]);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值