0/1背包问题

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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值