点击打开链接

题意:

给你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背包)的更多相关文章

  1. POJ 2184:Cow Exhibition(01背包变形)

    题意:有n个奶牛,每个奶牛有一个smart值和一个fun值,可能为正也可能为负,要求选出n只奶牛使他们smart值的和s与fun值得和f都非负,且s+f值要求最大. 分析: 一道很好的背包DP题,我们 ...

  2. POJ Washing Clothes 洗衣服 (01背包,微变型)

    题意:有多种颜色的衣服,由两个人合作来洗,必须洗完一种颜色才能洗下一种,求需要多少时间能洗完. 思路:将衣服按颜色分类,对每种颜色进行01背包,容量上限是该种颜色衣服全部洗完的耗时长一半,其实就是在最 ...

  3. 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 ...

  4. POJ Charm Bracelet 挑饰品 (常规01背包)

    问题:去珠宝店抢饰品,给出饰品种数n,能带走的重量m,以及每种饰品的重量w与价值v.求能带走的最大量. 思路:常规01背包. #include <iostream> using names ...

  5. 背包DP入门小笔记01背包

    FJUT OJ 2347 http://59.77.139.92/Problem.jsp?pid=2347 采药 TimeLimit:1000MS  MemoryLimit:128MB 64-bit ...

  6. POJ 2642 The Brick Stops Here 0-1背包

    poj: http://poj.org/problem?id=2642 大意: 给出n(n<=200)块黄铜合金,还有它们的浓度和价钱.给出若干个个询问使它们在n块中取 M 块 使得这M块合金的 ...

  7. Re0:DP学习之路 01背包如何打印路径?

    伪代码 用二维数组记录,如果出现可以转移的dp那么记录bk[当前体积][装的物品]=1 输出的时候倒推,如果存在连通的边那么输出并且总共的体积减去输出的体积 代码(uva-624,目前wa不明所以,网 ...

  8. POJ 3624.Charm Bracelet-动态规划0-1背包

    Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 47876   Accepted: 20346 ...

  9. POJ 2184 DP

    思路: f[j]表示当ts的和为j的时候tf的最大值. 这时候要分情况讨论: (我把状态平移了101000) 若ts[i]>=0倒序循环 否则正序 (防止ts被用了多次) f[101000]=0 ...

随机推荐

  1. 挑逗B少年搞计划10 假设你是愿意用我的心脏层剥离一层~

        这些天都非常推迟考试啊.然后,学校已安排一周培训,是的.在延迟学习,大狼医院我真的是正常水平.     幸好我们周六周日不让放假了,不然预计进度直接就停了.这两天也是抽出了时间把敲了一下三层的 ...

  2. hdu 4972 A simple dynamic programming problem(高效)

    pid=4972" target="_blank" style="">题目链接:hdu 4972 A simple dynamic progra ...

  3. 一些有用的javascript实例分析(二)

    原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...

  4. uva 11354 - Bond(树链拆分)

    题目链接:uva 11354 - Bond 题目大意:给定一张图.每次询问两个节点路径上进过边的危急值的最大值的最小值. 解题思路:首先建立最小生成数,然后依据这棵树做树链剖分. #include & ...

  5. 解析http302重定向url

    bool urlparse(const u_char* data,u_int len) { ip_header *ih; udp_header *uh; tcp_header *th; u_short ...

  6. MD5处理图片加密算法

    Android MD5加密算与J2SE平台一模一样,由于Android 平台支持 java.security.MessageDigest这个包.实际上与J2SE平台一模一样. 首先: 输入一个Stri ...

  7. C#中四个判等函数的认识

    donet提供了四个判等函数,分别是referenceEqual,静态Equal,具体类型Equal,和==. 首先来说,object.referenceEqual和静态Equal public st ...

  8. js 上一天、下一天

    function Previousday() { var curDate = new Date(CreateDate_Temp); * * * ); var strDate = preDate.get ...

  9. 利用EntityFramework获得双色球数据库

    原文 利用EntityFramework获得双色球数据库 双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买.以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往 ...

  10. ThinkPHP框架设计与扩展总结

    详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一 ...