C. Dima and Salad

题意

有n种水果,第i个水果有一个美味度ai和能量值bi,现在要选择部分水果做沙拉,假如此时选择了m个水果,要保证\(\frac{\sum_{i=1}^ma_i}{\sum_{i=1}^mb_i}==k\),问沙拉最大的美味度是多少?

思路

01背包变形。

对于给出的公式,我们化简一下:

\(\sum_{i=1}^ma_i-k*\sum_{i=1}^mb_i==0\)

就变成了把a[i]-k*b[i]作为体积,a[i]作为价值,向容量为0的背包里放,可以取得的最大价值。

因为a[i]-k*b[i]有正负,所以我们可以分别对正体积和负体积DP,体积为0直接算到答案中,在正负的DP值之中选择体积绝对值相等的最大和。

代码

  1. //#include<bits/stdc++.h>
  2. #include<vector>
  3. #include<stdio.h>
  4. #include<algorithm>
  5. #include<string.h>
  6. #include<string>
  7. #include<math.h>
  8. #include<queue>
  9. #include<map>
  10. #define pb push_back
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned long long ull;
  14. const int N=1e5+10;
  15. const int mod=1e9+7;
  16. const int inf=0x3f3f3f3f;
  17. struct note
  18. {
  19. int a,b;
  20. int wei;
  21. } arr[N];
  22. int dp1[N],dp2[N];
  23. int main()
  24. {
  25. int n,k;
  26. scanf("%d%d",&n,&k);
  27. for(int i=1; i<=n; i++)
  28. scanf("%d",&arr[i].a);
  29. int spos=0,sneg=0,ans=0;
  30. for(int i=1; i<=n; i++)
  31. {
  32. scanf("%d",&arr[i].b);
  33. int tmp=arr[i].a-k*arr[i].b;
  34. arr[i].wei=tmp;
  35. if(tmp>0)
  36. spos+=tmp;//正体积的和
  37. else if(tmp<0)
  38. sneg-=tmp;//负体积的和
  39. else
  40. ans+=arr[i].a;//体积为0直接算贡献
  41. }
  42. memset(dp1,0x8f,sizeof(dp1));
  43. memset(dp2,0x8f,sizeof(dp2));
  44. dp1[0]=dp2[0]=0;
  45. for(int i=1; i<=n; i++)//正
  46. {
  47. if(arr[i].wei<=0)
  48. continue;
  49. for(int j=spos; j>=arr[i].wei; j--)
  50. dp1[j]=max(dp1[j],dp1[j-arr[i].wei]+arr[i].a);
  51. }
  52. for(int i=1; i<=n; i++)//负
  53. {
  54. if(arr[i].wei>=0)
  55. continue;
  56. for(int j=sneg; j>=-arr[i].wei; j--)
  57. dp2[j]=max(dp2[j],dp2[j+arr[i].wei]+arr[i].a);
  58. }
  59. int rel=0;
  60. for(int i=1; i<=min(sneg,spos); i++)//选择两个体积绝对值相等的最大值
  61. {
  62. if(dp1[i]>0&&dp2[i]>0)
  63. rel=max(rel,dp1[i]+dp2[i]);
  64. }
  65. ans+=rel;
  66. if(ans==0)
  67. printf("-1\n");
  68. else
  69. printf("%d\n",ans);
  70. return 0;
  71. }

CF#214 C. Dima and Salad 01背包变形的更多相关文章

  1. CF Dima and Salad 01背包

    C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  2. Codeforces Round #214 (Div. 2) C. Dima and Salad (背包变形)

    C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  3. CodeForces - 366C Dima and Salad (01背包)

    题意:n件东西,有属性a和属性b.要选取若干件东西,使得\(\frac{\sum a_j}{\sum b_j} = k\).在这个条件下,问\(\sum a_j\)最大是多少. 分析:可以将其转化为0 ...

  4. FZU 2214 Knapsack problem 01背包变形

    题目链接:Knapsack problem 大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积. 问,最多能盛的物品价值和是多少? 思路:01背包变形,因为w太大, ...

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

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

  6. HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. 【01背包变形】Robberies HDU 2955

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...

  8. Dima and Salad(完全背包)

    Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. Codeforces 366C Dima and Salad:背包dp

    题目链接:http://codeforces.com/problemset/problem/366/C 题意: 有n个物品,每个物品有两个属性a[i]和b[i]. 给定k,让你选出一些物品,使得 ∑ ...

随机推荐

  1. springboot前后端分离跨域

    @Configurationpublic class CrossConfig implements WebMvcConfigurer { @Override public void addCorsMa ...

  2. SQLi —— 逗号,空格,字段名过滤突破

    前言 出于上海大学生网络安全大赛的一道easysql,促使我积累这篇文章.因为放了大部分时间在Decade和Babyt5上,easysql一点没看,事后看了WP,发现看不懂怎么回事,于是了解了一番. ...

  3. [linux] 权限问题

    权限问题一直蒙蒙的,下面就是总结一下!(原文链接:http://www.cnblogs.com/chengJAVA/p/4319420.html) 指令名称:chmod 使用权限 : 所有使用者 使用 ...

  4. mysql 使用记录

    修改 mysql 数据库密码 mysqladmin -u username -h host_name password -P <port> "new_password" ...

  5. JasperReports入门教程(二):中文打印

    JasperReports入门教程(二):中文打印 背景 在上一篇中我们介绍了JasperReport的基本入门,也展示了一个报表.但是我们的示例都是使用的英文,如果我们把需要打印的数据改为中文会怎么 ...

  6. MAC地址欺骗(原理及实验)

    MAC地址欺骗 MAC地址欺骗(或MAC地址盗用)通常用于突破基于MAC地址的局域网访问控制,例如在交换机上限定只转发源MAC地址修改为某个存在于访问列表中的MAC地址即可突破该访问限制,而且这种修改 ...

  7. QString 转换成 wchar 的一个小陷阱

    QString::toWCharArray(wchar_t * array) 其中 wchar_t * array 除了要分配内存之外,必须用 wmemset 初始化. 环境是 Visual Stud ...

  8. Inno Setup: Ask for reboot after uninstall

     https://stackoverflow.com/questions/36497580/inno-setup-ask-for-reboot-after-uninstall   Use Uninst ...

  9. cut,xargs,sort,tr,rename命令解析

    cut 文件内容查看 显示行中的指定部分,删除文件中指定字段 显示文件的内容,类似于下的type命令. 语法: cut(选项)(参数) 选项: -b:仅显示行中指定直接范围的内容: -c:仅显示行中指 ...

  10. CSS开发技巧(四):解决flex多行布局的行间距异常、子元素高度拉伸问题

    在使用flex布局时,若出现换行,有两种较为特殊的现象是值得我们研究的: 子元素高度被拉伸,其实际高度大于它的内容高度. 各行子元素之间的行间距过大,甚至我们根本没有给子元素设置margin. 现在我 ...