码迷,mamicode.com
首页 > 其他好文 > 详细

[hiho 06]01背包

时间:2015-04-26 20:55:21      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

状态 f[i, j] 表示已经决定了前 i 个物品的选取情况,总费用不超过j;

状态转移方程 f[i, j] = max{f[i – 1, j], f[i – 1, j – need[i]] + value[i]};

最终解的状态表示 f[n, m]。

 

注意到状态转移只需用到上层的两个状态,所以可以将状态降维进行空间压缩。

由于j – need[i] < j,所以每层j从大向小计算状态。

 

#include <iostream>
#include <algorithm>

using namespace std;

int f[100005];

int main() {
	int n, m;
	cin >> n >> m;

	int val, need;
	for (int i = 0; i < n; i++) {
		cin >> need >> val;
		for (int j = m; j >= need; j--) {
			f[j] = max(f[j], f[j - need] + val);
		}
	}
	cout << f[m] << endl;
	return 0;
}

[hiho 06]01背包

标签:

原文地址:http://www.cnblogs.com/xblade/p/4458209.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!