转自:http://blog.csdn.net/liuqiyao_01/article/details/8753686

题意:这是又是一道01背包的变体,题目要求选出一些牛,使smartness和funness值的和最大,而这些牛有些smartness或funness的值是负的,还要求最终的smartness之和以及funness之和不能为负。

  这道题的关键有两点:一是将smartness看作花费、将funness看作价值,从而转化为01背包;二是对负值的处理,引入一个shift来表 示“0”,这里的shift一定要大于每一个smartness的绝对值,另外在遍历cost[]的时候如果cost[i]>0,显然时从开的数组 的最大值maxm 开始往下减,如果cost[i]<0,则是从0(是0,不是shift)开始往上增加。大于0的情况容易想到,小于0的情况比较费解,需要仔细思 考。

  考虑只有一只牛,它的smartness为-x(x>0),funness为y(y>0),由于将dp[shift]赋初值为0,其它的dp[]赋初值为负无穷,所以有dp[shift-(-x)]+y>dp[shift],即dp[x]会被赋为dp[shift-(-x)]+y即y( dp[x]=max(dp[shift-(-x)]+y,dp[shift])  ),由于x小于shift,所以在最后遍历最大值的时候,这个值根本不会被遍历。

  再考虑前面已经有一些牛,此时dp[shift+x]=y(x>0,y>0)现在出现了一只为-a b(a>0,b>0)的牛,那么dp[shift+X-a]会被赋为dp[shift+x-a- (-a)]+b=dp[shift+x]+b=y+b;最终遍历的时候,如果取最后一只牛,和为x-a+y+b,如果不取,和为x+y,所以最大值究竟是 谁取决于b-a的正负。

  综上所述,这是一种满足题目要求的方法,所以在cost[i]<0的时候时从0开始往上增加。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define inf    (0x3f3f3f3f)
 6 #define max(a,b)    ((a)>(b)?(a):(b))
 7 const int maxn=105;
 8 const int maxm=210000;
 9 const int shift=10000;
10 int dp[maxm];
11 int main()
12 {
13     int n;
14     while(scanf("%d",&n)!=EOF)
15     {
16         int a[maxn],b[maxn];
17         int va=0,vb=0;
18         int i,j;
19         for(i=0;i<n;i++)
20         {
21             scanf("%d%d",&a[i],&b[i]);
22         }
23         memset(dp,-inf,sizeof(dp));
24         dp[shift]=0;
25         for(i=0;i<n;i++)
26         {
27             if(a[i]>0)
28                 for(j=maxm-1;j>=a[i];j--)
29                     dp[j]=max(dp[j-a[i]]+b[i],dp[j]);
30             else
31                 for(j=0;j<maxm+a[i];j++)
32                     dp[j]=max(dp[j-a[i]]+b[i],dp[j]);
33         }
34         int ans=0;
35         for(i=shift;i<maxm;i++)
36             if(dp[i]>0&&(i-shift+dp[i]>ans))
37                 ans=i-shift+dp[i];
38         printf("%d\n",ans);
39     }
40     return 0;
41 }

转载于:https://www.cnblogs.com/cnblogs321114287/p/4349176.html

hdu 2184 01背包变形相关推荐

  1. HDU 3466 01背包变形

    给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...

  2. codeforce Gym 101102A Coins (01背包变形)

    01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...

  3. P1734 最大约数和 01背包变形

    传送门 思路:01背包变形题.将i看成重量,i的因子看成价值即可.背包自然是s. /** * From: * Qingdao Agricultural University * Created by ...

  4. HDU 2546 饭卡 01背包变形

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  5. hdu 3732(01背包转多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包..最多也就11*11=121件 ...

  6. hdu 2955 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 如果认为:1-P是背包的容量,n是物品的个数,sum是所有物品的总价值,条件就是装入背包的物品的体积和不能 ...

  7. 2022-9-2何以包邮(01背包变形)(c/c++实测满分)

    总结:         此题是背包问题的变形,物品的价值和重量有所改变,背包的容量限制有所改变,但核心动态规划求法没有改变.只需要在背包问题的解法上根据题意对物品表示,答案输出进行改变即可. 背包算法 ...

  8. poj 2063 Investment(01背包变形)

    http://poj.org/gotoproblem?pid=2063 (1)上限 m 一直上升的 n 次01背包问题,比一般的01背包多了一重循环: (2)本题出现了各种错误:1)刚开始,没注意 m ...

  9. hdu 1574(01背包)

    RP问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Des ...

最新文章

  1. NSUserDefaults的用法
  2. 解决bootstrap-table多次请求只触发一次的问题
  3. g++配置选项-std=c++11
  4. 亿能 性能测试课程 2013年度 公开课 深圳站
  5. 「Tensorflow」错误tensorflow.python.framework.errors_impl.UnknownError: 2 root error(s) found.
  6. 如何搭建一个“不可告人的”私人专属网盘?教程拿去
  7. css hack(ie6-9,firefox,chrome,opera,safari)
  8. Debian下IPv6设定主地址 Set primary IPv6 address under Debian Linux
  9. Java比以往任何时候都摇滚
  10. Django讲课笔记06:搭建项目开发环境
  11. Log4net使用详细说明
  12. [转载] [硕.Love Python] QuickSort(快速排序)
  13. mac环境下安装mysql
  14. 国内优秀论坛之大汇集
  15. 适合计算机课堂玩的游戏,几个课堂小游戏(能活跃课堂气氛)
  16. iOS常用第三方库大全
  17. JavaScript实现的躲避球小游戏
  18. fluent当中的梯度宏和VOF梯度的获取【转载】
  19. 机加工行业如何打造MES系统,本文让你一目了然
  20. LBR_iiwa_14_R820代码解析

热门文章

  1. MySQL Operators(比较操作符,逻辑运算符)
  2. 1.6 语言模型和序列生成
  3. 我的域控是不是被攻击了?吓!
  4. vSphere虚拟化使用第三方备份方案常见CBT故障实战处理
  5. Docker学习总结(20)——Docker 容器实践精华问答集锦
  6. Git学习总结(12)——多人开发 Git 分支管理详解
  7. idea上一步下一步快捷键_【MySQL】一步一步的教你在windows下安装MySQL5.7
  8. python调用hive与java调用区别_python3.6.5基于kerberos认证的hive和hdfs连接调用方式
  9. VS调试 启动vs报错--未启动IIS
  10. 转载 : JSP取得绝对路径