0-1背包的动态规划解法

/************************************************************************\
n个物品,物品i 重量wi>0 价值为vi  背包最大能W goal->求不超过容量的最大价值
Item	Value	Weight
1    	1    	1
2	    6	    2
3    	18   	5
4   	22   	6
5   	28   	7  (W = 11)
Def. OPT(i, W) = max profit subset of items 1, …, i with weight limit W.
Case 1: OPT does not select item i.

OPT selects best of { 1, 2, …, i-1 } using weight limit W
Case 2: OPT selects item i.
 new weight limit = W – wi 

OPT selects best of { 1, 2, …, i–1 } using this new weight limit
\************************************************************************/
#include<iostream>
#include<fstream>
using namespace std;

#define max(a,b)(a>b ? a:b)

const int MAX = 100;
int Weight; //max weight of the pack
int w[MAX];
int v[MAX];
int dp[MAX];//dp[i] imply that the max value under the weight of i


//滚动数组 由于dp[i][j]只与dp[i-1][X]有关系 所以可以减少到一维数组 
int solveArray(int n)
{
	int i,j;
	for(i=0; i<=Weight; i++)//init dp
		dp[i] = 0;

	for(i=1; i<=n; i++)
	{
		for(j=Weight; j>=w[i]; j--)
		{
			//if select the ith goods,then dp[j] = v[i]+dp[j-w[i]] 
			dp[j] = max(dp[j], v[i] + dp[j-w[i]]);
		}
	}
	return dp[Weight];//return max value 
}

int main()
{
	ifstream cin("in.txt");
	//ofstream cout("out.txt");
	int i, n;
	while(cin >> n)
	{
		if(n==0)  break;
		cin >> Weight;
		for(i=1; i<=n; i++)
			cin >> v[i];
		for(i=1; i<=n; i++)
			cin >> w[i];
		cout << "max value :" << endl;

		int ans = solveArray(n);
		cout << ans << endl;
	}
	return 0;
}
测试数据
5 11
1 16 18 22 28
1 2  5  6  7
0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值