poj 2184(dp变形,进一步加深01背包)
题意:
给你n个物品,每个物品都有两个属性,s和f,要求选择一些物品,使sum(s)+sum(f)最大,并且sum(s)>=0&&sum(f)>=0,
根据01背包的性质,每件物品有选与不选两种方式,我们把s看着物品所占的体积,把f看作是物品的价值,求dp[i]表示体积为i的总价值,则求dp[i]+i就可以了。
有因为可能出现负值,我们可以把体积都+10000(1000*100),最后求dp[i]+i-10000;
现在我们来分析背包循环的方向
一般01背包dp[v]=max(dp[v-a]+b,dp[v])中,v从V->a因为我们要保证dp[v]的价值是从dp[v-a]得来的,如果v从a->V,dp[v-a]先改变后才算dp[v],显然多算了当前的物品。
所以回到题目中来,当s为正时,dp[j]要从dp[j-s](j>j-s,先算大的)得来,所以j从20000->s;当s为负时,dp[j]要从dp[j+(-s)](j<j-s,先算小的)得来,所以j从0到20000+s;
#include"stdio.h"
#include"string.h"
#define N 1005
int dp[200001]; int max(int a,int b){return a>b?a:b;}
int main()
{
int n;
int i,j;
int s,f;
int ans;
while(scanf("%d",&n)!=-1)
{
for(i=1;i<=200000;i++)dp[i]=-999999999;
dp[100000]=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&s,&f);
if(s>0)
{
for(j=200000;j>=s;j--)
dp[j]=max(dp[j],dp[j-s]+f);
}
else if(s<0)
{
for(j=0;j<=200000+s;j++)
dp[j]=max(dp[j],dp[j-s]+f);
}
}
ans=-99999999;
for(i=100000;i<=200000;i++)
{
if(dp[i]>=0)
ans=max(ans,dp[i]+i-100000);
}
if(ans<0)ans=0;
printf("%d\n",ans);
}
return 0;
}
poj 2184(dp变形,进一步加深01背包)的更多相关文章
- POJ 2184:Cow Exhibition(01背包变形)
题意:有n个奶牛,每个奶牛有一个smart值和一个fun值,可能为正也可能为负,要求选出n只奶牛使他们smart值的和s与fun值得和f都非负,且s+f值要求最大. 分析: 一道很好的背包DP题,我们 ...
- POJ Washing Clothes 洗衣服 (01背包,微变型)
题意:有多种颜色的衣服,由两个人合作来洗,必须洗完一种颜色才能洗下一种,求需要多少时间能洗完. 思路:将衣服按颜色分类,对每种颜色进行01背包,容量上限是该种颜色衣服全部洗完的耗时长一半,其实就是在最 ...
- HDU 1011 Starship Troopers【树形DP/有依赖的01背包】
You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...
- POJ Charm Bracelet 挑饰品 (常规01背包)
问题:去珠宝店抢饰品,给出饰品种数n,能带走的重量m,以及每种饰品的重量w与价值v.求能带走的最大量. 思路:常规01背包. #include <iostream> using names ...
- 背包DP入门小笔记01背包
FJUT OJ 2347 http://59.77.139.92/Problem.jsp?pid=2347 采药 TimeLimit:1000MS MemoryLimit:128MB 64-bit ...
- POJ 2642 The Brick Stops Here 0-1背包
poj: http://poj.org/problem?id=2642 大意: 给出n(n<=200)块黄铜合金,还有它们的浓度和价钱.给出若干个个询问使它们在n块中取 M 块 使得这M块合金的 ...
- Re0:DP学习之路 01背包如何打印路径?
伪代码 用二维数组记录,如果出现可以转移的dp那么记录bk[当前体积][装的物品]=1 输出的时候倒推,如果存在连通的边那么输出并且总共的体积减去输出的体积 代码(uva-624,目前wa不明所以,网 ...
- POJ 3624.Charm Bracelet-动态规划0-1背包
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 47876 Accepted: 20346 ...
- POJ 2184 DP
思路: f[j]表示当ts的和为j的时候tf的最大值. 这时候要分情况讨论: (我把状态平移了101000) 若ts[i]>=0倒序循环 否则正序 (防止ts被用了多次) f[101000]=0 ...
随机推荐
- asp.net学习之GridView七种字段
原文:asp.net学习之GridView七种字段 asp.net中GridView绑定到数据源时,可以自动显示数据源的各个字段.只要设定其AutoGenerateColumns为TRUE即可.但这, ...
- (两)unity4.6Ugui中国教程文档-------总结-UGUI Canvas
大家好,我是广东太阳. 转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unitym ...
- 首先运行application的name相应的类或做activity中间name相应的类?
今天找到该程序条目中找到以下两个条件name我写了一个测试程序,一般如以下: 看mainfest.xml <application android:allowBackup="true& ...
- POJ3690 Constellations 【KMP】
Constellations Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5044 Accepted: 983 Des ...
- JavaBean中DAO设计模式介绍
一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是client,简单的来说就是浏览器. 2.显示层:JSP/ ...
- Cocos2d-x3.0 文件处理
1.从文件中读取 auto sharedFileUtils = FileUtils::getInstance(); std::string ret; sharedFileUtils->purge ...
- HDU Redraw Beautiful Drawings 推断最大流是否唯一解
点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 ...
- 《python源代码剖析》笔记 python虚拟机中的函数机制
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.Python虚拟机在运行函数调用时会动态地创建新的 PyFrameObject对象, 这 ...
- Linux Mysql 权限相关信息 来源于网络
查看用户权限 show grants for 你的用户 比如: show grants for root@’localhost’; mysql> use mysql; Database chan ...
- 1.cocos2dx它Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)
CCMenu 基本结构 CCMenu继承自CCLayer,本质是一个容器.须要被addChild到父类中去. CCMenuItem是菜单项,它有例如以下子类: CCMenuItemFont;CC ...