小白阐述背包问题的递归解法

记录一下今天刚学的背包问题的递归解法!

  1.问题描述:假设你有一个容量为8的背包,现在有4个物品大小和价值分别为size[4] = {3,3,4,5} value[4] = {7,6,7,9}怎么使背走的物品价值最大?

  2.思路:没啥思路吧!递归的做法大家应该都能看懂的!过几天我看了动态规划后再做一遍吧!

#include <iostream>
using namespace std;

int max(int a , int b){
	return a > b ? a : b;
}

//容量,物品的大小,物品的价值,物品的序号
int beibao(int capacity , int *size , int *value ,int n){
	//当物品没有的时候或者背包没有容量
	if(n == 0 || capacity == 0) return 0;
	//当物品n的大小大于背包的容量时
	else if(size[n-1] > capacity){
		//到下一个物品
		return beibao(capacity , size , value , n-1);
	}
	else{
		//放入当前物品和不放入当前物品
		return max( value[n-1] + beibao(capacity - size[n-1] , size ,value ,n-1) , beibao(capacity , size, value , n-1) );
	}
}

int main() {
	//测试
	int capacity = 8;
	int size[4] = {3,3,4,5};
	int value[4] = {7,6,7,9};
	int n =4;
	int maxValue = beibao(capacity,size,value,n);
	cout<<maxValue;
	return 0;
}

下面我的一张丑图帮助理解

在这里插入图片描述

3.总结:递归对栈的消耗有点大,但代码方便理解。尽量还是使用动态规划来做。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值