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值之中选择体积绝对值相等的最大和。

代码

//#include<bits/stdc++.h>
#include<vector>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<math.h>
#include<queue>
#include<map>
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e5+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f; struct note
{
int a,b;
int wei;
} arr[N];
int dp1[N],dp2[N];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
scanf("%d",&arr[i].a);
int spos=0,sneg=0,ans=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&arr[i].b);
int tmp=arr[i].a-k*arr[i].b;
arr[i].wei=tmp;
if(tmp>0)
spos+=tmp;//正体积的和
else if(tmp<0)
sneg-=tmp;//负体积的和
else
ans+=arr[i].a;//体积为0直接算贡献
}
memset(dp1,0x8f,sizeof(dp1));
memset(dp2,0x8f,sizeof(dp2));
dp1[0]=dp2[0]=0;
for(int i=1; i<=n; i++)//正
{
if(arr[i].wei<=0)
continue;
for(int j=spos; j>=arr[i].wei; j--)
dp1[j]=max(dp1[j],dp1[j-arr[i].wei]+arr[i].a);
}
for(int i=1; i<=n; i++)//负
{
if(arr[i].wei>=0)
continue;
for(int j=sneg; j>=-arr[i].wei; j--)
dp2[j]=max(dp2[j],dp2[j+arr[i].wei]+arr[i].a);
}
int rel=0;
for(int i=1; i<=min(sneg,spos); i++)//选择两个体积绝对值相等的最大值
{
if(dp1[i]>0&&dp2[i]>0)
rel=max(rel,dp1[i]+dp2[i]);
}
ans+=rel;
if(ans==0)
printf("-1\n");
else
printf("%d\n",ans);
return 0;
}

最新文章

  1. nodejs模块——fs模块
  2. Indexing and Hashing
  3. PHP文件系统处理相关操作
  4. python3爬虫再探之EXCEL
  5. Linux大量TIME_WAIT的解决办法
  6. 【译】Android系统简介—— Activity
  7. ACdream 1083 有向无环图dp
  8. [Swust OJ 771]--奶牛农场(几何题,画图就好)
  9. grep egrep fgrep命令
  10. kingso_module - Taocode
  11. List集合及新特性引用
  12. codeforces 868B Race Against Time
  13. win10右键添加在此处打开powershell
  14. WPF打印京东电子面单(可以异步)
  15. jquery的自定义事件通过on绑定trigger触发
  16. 四则运算之Right-BICEP单元测试
  17. tf.trainable_variables()
  18. nuget.org无法解析的办法
  19. 关于Entity Framework的概念及搭建
  20. SDN 第三次上机作业

热门文章

  1. CVE-2019-0193 Apache solr velocity模块漏洞
  2. kubernetes的cni0和flannel.1的关系?
  3. Java 多线程 -- 理解锁:手动实现可重入锁和不可重入锁
  4. 关于flex弹性布局
  5. 2019-2020-1 20199325《Linux内核原理与分析》第六周作业
  6. [Linux] 检查是否已有进程在运行
  7. [Windows API] Listing the Files in a Directory,可用来数文件夹下有多少个子文件(夹)
  8. mysql硬件优化
  9. Android 项目 Android 学习手册(一)
  10. CC视频CTO栗伟:CDN系统架构及CC视频应用实践