记录一下今天刚学的背包问题的递归解法!
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.总结:递归对栈的消耗有点大,但代码方便理解。尽量还是使用动态规划来做。