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 ...
随机推荐
- 挑逗B少年搞计划10 假设你是愿意用我的心脏层剥离一层~
这些天都非常推迟考试啊.然后,学校已安排一周培训,是的.在延迟学习,大狼医院我真的是正常水平. 幸好我们周六周日不让放假了,不然预计进度直接就停了.这两天也是抽出了时间把敲了一下三层的 ...
- hdu 4972 A simple dynamic programming problem(高效)
pid=4972" target="_blank" style="">题目链接:hdu 4972 A simple dynamic progra ...
- 一些有用的javascript实例分析(二)
原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...
- uva 11354 - Bond(树链拆分)
题目链接:uva 11354 - Bond 题目大意:给定一张图.每次询问两个节点路径上进过边的危急值的最大值的最小值. 解题思路:首先建立最小生成数,然后依据这棵树做树链剖分. #include & ...
- 解析http302重定向url
bool urlparse(const u_char* data,u_int len) { ip_header *ih; udp_header *uh; tcp_header *th; u_short ...
- MD5处理图片加密算法
Android MD5加密算与J2SE平台一模一样,由于Android 平台支持 java.security.MessageDigest这个包.实际上与J2SE平台一模一样. 首先: 输入一个Stri ...
- C#中四个判等函数的认识
donet提供了四个判等函数,分别是referenceEqual,静态Equal,具体类型Equal,和==. 首先来说,object.referenceEqual和静态Equal public st ...
- js 上一天、下一天
function Previousday() { var curDate = new Date(CreateDate_Temp); * * * ); var strDate = preDate.get ...
- 利用EntityFramework获得双色球数据库
原文 利用EntityFramework获得双色球数据库 双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买.以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往 ...
- ThinkPHP框架设计与扩展总结
详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一 ...