process函数表示,对c和p数组,当前第0至i-1个物品包括在内,已经花费了cost的空间,此时背包容量为bag,
此时求对第i个物品,如果不要,这process(c,p,i,cost,bag) = process(c,p,i+1,cost,bag)
如果当前剩余容量可以容纳第i个物品,那么,process(c,p,i,cost,bag)的取值为max(process(c,p,i+1,cost,bag), p[i]+process(c,p,i+1,cost+c[i],bag))
#include<iostream>
#include<vector>
using namespace std;
#define Max(a,b) a>b?a:b
int maxValue(vector<int> &c, vector<int>&p, int bag);
int process(vector<int>&c, vector<int>&p, int i, int cost, int bag);
int maxValue2(vector<int>&c, vector<int>&p, int bag);
int maxValue(vector<int> &c, vector<int>&p, int bag)
{
return process(c, p, 0, 0,bag);
}
int process(vector<int>&c, vector<int>&p, int i, int cost, int bag)
{
if (cost > bag)
return INT_MIN;
if (i == c.size())
return 0;
return Max(process(c, p, i + 1, cost, bag), p[i] + process(c, p, i + 1, cost+c[i], bag));
}
//动态规划
int maxValue2(vector<int>&c, vector<int>&p, int bag)
{//数组dp是一个物品个数和背包容量的一个二维表
vector<vector<int>>dp(c.size()+1, vector<int>(bag + 1));
for (int i = c.size() - 1; i >= 0; --i)
{
for (int j = bag; j >=0; --j)
{
dp[i][j] = dp[i + 1][j];//第i+1个物品不要,
if (j + c[i] <= bag)//要
{
dp[i][j] = Max(dp[i][j], p[i] + dp[i + 1][j + c[i]]);
}
}
}
return dp[0][0];
}
void main()
{
vector<int>c{ 3,2,4,7 };
vector<int>p{ 5,6,3,19 };
int bag = 11;
cout << maxValue(c, p, bag)<<endl;
cout << maxValue2(c, p, bag)<<endl;
system("pause");
}