poj_2184

/*
 * 01背包問題
 * 把smart看做背包的體積,fun當做物品的價值,問題轉化為
 * 求01背包的最大價值
 * 狀態:dp[i] 表示體積si為i時的fun最大價值
 * 狀態轉移:dp[i] = max(dp[i], dp[i-sj]+fj);
 * 需要注意的是,背包價值都可能為負數,解決方案是整體左移
 
 * 01 knapsack problem
 * The volume of smart seen as a backpack, fun as the value of the items, the problem is transformed into
 * Seek the maximum value of 01 backpack
 * Status: dp [i] volume si fun when i maximum value
 * The state transition: dp [i] = max (dp [i], dp [i-sj] + fj);
 * Note backpack value may be negative, the solution is shifted left
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define ORI		100010
#define MAXN	200020
#define INF 	0x7ffffff

int dp[MAXN];

int dynamic_programming(int n)
{
	int x, y, min_pos(ORI), max_pos(ORI), ans(0);
	fill(dp, dp+MAXN, -INF);	dp[ORI] = 0;
	while( n -- ) {
		scanf("%d %d", &x, &y);
		if( x < 0 ) {
			min_pos += x;
			for(int i = min_pos; i <= max_pos+x; i ++) {
				if( dp[i] < dp[i-x]+y ) {
					dp[i] = dp[i-x]+y;
					if( dp[i] >= 0 && i >= ORI ) {
						ans = max(ans, dp[i]+i-ORI);
					}
				}
			}
		}
		else {
			max_pos += x;
			for(int i = max_pos; i >= min_pos+x; i --) {
				if( dp[i] < dp[i-x]+y ) {
					dp[i] = dp[i-x]+y;
					if( dp[i] >= 0 && i >= ORI ) {
						ans = max(ans, dp[i]+i-ORI);
					}
				}
			}
		}
	}
	return ans;
}

int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
	freopen("test.in", "r", stdin);
#endif
	int n;
	while( ~scanf("%d", &n) ) {
		printf("%d\n", dynamic_programming(n));
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值