HDU 1574 RP问题(01背包变形)

来源:互联网 发布:文字照片软件 编辑:程序博客网 时间:2024/05/16 18:18

转载:http://blog.csdn.net/mnlm1991/article/details/6083262

RP问题

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 959 Accepted Submission(s): 353


Problem Description
在人类社会中,任何个体都具有人品,人品有各种不同的形式,可以从一种形式转换为另一种形式,从一个个体传递给另一个个体,在转换和传递的过程中,人品不会消失,也不被能创造,这就是,人品守恒定律!
人品守恒定律更形象的描述,当发生一件好事,你从中获利,必定消耗一定量RP;当发生一件不幸的事,你在其中有所损失,必定积攒一定量RP。
假设在一个时间段内在你身上可能会发生N个事件,每个事件都对应一个RP变化值a、RP门槛值b和获益值c。当RP变化值a为正,获益值c必定为负,只有你当前的RP值小于等于RP门槛值b的时候,此事件才有可能发生,当此事件发生时,你的RP值将增加|a|,获益值将减少|c|。反之,当RP变化值a为负,获益值c必定为正,只有你当前的RP值大于等于RP门槛值b的时候,此事件才有可能发生,当此事件发生时,你的RP值将减少|a|,获益值将增加|c|。
一个事件在满足上述RP条件的前提下,未必会发生。假设在这段时间之前你所具有的RP值和获益值都为0,那么过了这段时间后,你可能达到的最大获益值是多少?
注意:一个人的所具有的RP值可能为负。

Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每组测试数据的第一行为一个正整数N (0 < N <= 1000),表示这个时间段在你身上可能发生N个事件。接下来N行,每行有三个整数a, b, c (0 <= |a| <= 10, 0 <= |b| <= 10000, 0 <= |c| <= 10000)。这N个事件是按照输入先后顺序先后发生的。也就是说不可能先发生第i行的事件,然后再发生i – j行的事件。

Output
对应每一组输入,在独立一行中输出一个正整数,表示最大可能获益值。

Sample Input
31-1 0 1210 200 -1-5 8 33-5 0 410 -5 -5-5 5 10

Sample Output
129

Author
lwg

Source
HDU 2007-1 Programming Contest 

/*思路:01背包变形 问题描述:有N件连续的事件,有些事件是RP值增加a,获益值减少c。有些则相反。每件事件还有一个RP门槛b,RP值增加的事件RP得>=RP门槛,RP值减少的事件则得RP<=RP门槛。满足上述条件不一定就会发生。其中N<= 1000 ,a<=10,b<=10000,c<=10000;求这些事件的最大获益值, 事件发生的顺序按照输入先后顺序先后发生,也就是说不可能先发生第i行的事件, 然后再发生i – j行的事件。开始RP和获益值都为0; 算法:是DP题。一件事件发生与否只和当前RP有关,所以想到存储到达某个事件是各个RP的最大获益。不能开二维的数组(数据太大),只能开一个dp[20001];dp[j]表示RP为j - 10000;  另外还要一个标记数组,标记是否可以出现这个RP值;*//* 转载 */  #include<cstdio>  #include<cstdlib>  #include<cmath>  #include<cstring>  #include<vector>  #include<algorithm>  #include<string>  #include<map>  #include<bitset>  #include<queue>  using namespace std;  const int size = 20001;  int dp[size];  //默认加了10000 int T;  int N;  bool visited[size];  int main()  {      scanf("%d", &T);      while (T--)      {          scanf("%d", &N);          int a, b, c;          int i;          int j;          memset(dp, 0, sizeof(dp));          memset(visited, 0, sizeof(visited));          dp[10000] = 0;  //相当于初始第一个         visited[10000] = true;  //初始0是可以达到的         for (i = 0; i < N; i++)          {              scanf("%d%d%d", &a, &b, &c);              if (a > 0)//a大于0 c是小于0 当RP要小于RP门槛 才能             {                  for (j = b + 10000; j >= 0; j--) //RP门槛B,当前门槛j要小于等于b                 {                      if (visited[j])  //当前人品j要可以达到                     {                           if (!visited[j + a]) //如果加了人品之前没达到,就初始化                         {                              dp[j + a] = dp[j] + c;                              visited[j + a] = true;                          }                          else   //否则就看要不要拿                         {                              dp[j + a] =                               max(dp[j + a], dp[j] + c);                          }                      }                  }              }              else if (a < 0)  //a<0  c>0 当前人品j大于门槛人品b,才行               {                  for (j = b + 10000; j < size; j++)                  {                      if (visited[j])                      {                          if (!visited[j + a])                          {                              dp[j + a] = dp[j] + c;                              visited[j + a] = true;                          }                          else                           {                              dp[j + a] =                               max(dp[j + a], dp[j] + c);                          }                      }                  }              }          }          int ans = 0;          for (i = 0; i < size; i++)          {              if (visited[i] && dp[i] > ans)              {                  ans = dp[i];              }          }          printf("%d\n", ans);      }      return 0;  }  



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 中国银行储蓄不能充值支付宝怎么办 微信怎么改银行卡密码忘记了怎么办 微信号手机号码换了密码忘了怎么办 微信被盗密码被改绑定手机号怎么办 微信qq号登陆改密码忘记了怎么办 本人微信红包赌博输了50万怎么办 4g飞享套餐话费用完了怎么办 手机丢了查话费欠了几百块怎么办 注销电信手机卡里面的余额怎么办 联通手机卡注销后里面的余额怎么办 手机卡网上销户以后剩余话费怎么办 联通新号注册微信发不了短信怎么办 韩博士装机卡在驱动恢复怎么办 xp打印后程序服务没有运行怎么办 刚注册的微信显示异常怎么办 不小心删了照片怎么办不要钱 qq邀请好友辅助验证成功后怎么办 微信申诉怎么让好友发验证码怎么办 微信申诉好友都删除了怎么办 恋与制作人原来的帐号不见了怎么办 手机号被别人注册了手机银行怎么办 想上老婆的陌陌号但要验证码怎么办 中国家医居民端注册信息有误怎么办 别人给我充的q币怎么办 qq忘记密码手机号码也换了怎么办 手机号码不用了微信忘记密码怎么办 手机号码注销了微信忘记密码怎么办 微信忘记密码手机号码也换了怎么办 微信钱包里的钱莫名少了怎么办 被骗给人冲q币了怎么办 支付宝账户异常无法领取红包怎么办 微信q币支付错了怎么办 王者荣耀不小心把点卷用了怎么办 微信绑定的qq号密码忘记了怎么办 微信红包实名认证没银行卡怎么办 手机烂了换新手机微信支付宝怎么办 支付宝转账给别人号码没用了怎么办 微信转账验证码收不到怎么办 陌生网友生日叫我发红包怎么办 微信群的群主不小心推出群该怎么办 支付宝验证码被别人知道了怎么办