题目链接:https://cn.vjudge.net/problem/CodeForces-366C

题意

给出n个水果和一个常数k,其中每个水果都有两种性质ai, bi(美味度,卡路里量)。

要保证$ \frac{ \sum a_i }{ \sum b_i }=k $的前提下,求出最大的ai和。

思路

不知道是什么背包类型,这类背包是这样的:多个基础的01背包(或其他)

  1. 对单个背包的理解是这样:

    在一元不定式的约束,且dp函数具有单调性时,dp函数值最大化。

    比如01背包是这样的:

    在总代价小于某值,且dp[cost]=val中cost越大val一定不会变小时(容量越大,能选的价值越大),价值最大化
  2. 明显这题不满足「一元不定式的约束」。

    于是我们就可以想办法把问题拆成两个背包,或者改成两个状态dp[taste][calories]。

    虽然明显后一个状态将超时。
  3. 如果拆成两个背包,就必须满足「dp函数具有单调性」(自变量越大,因变量不会变小)。

    我们可以发现 f[abs(\sum t[i]-kc[i])]=\sum t[i], t[i]-kc[i]<0(>=0)是单调的。

    那么问题有解。

提交过程

TLE 看错n大小了,直接暴力了...

AC

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e4+20, maxw=1e5+20;
const int INF=1e5+20;
int cal[maxn], tas[maxn], n, k;
int f[maxw], g[maxw]; int main(void){
while (scanf("%d%d", &n, &k)==2){
for (int i=1; i<=n; i++) scanf("%d", &tas[i]);
for (int i=1; i<=n; i++) scanf("%d", &cal[i]); for (int i=0; i<maxw; i++)
f[i]=g[i]=-INF;
f[0]=g[0]=0;
for (int i=1; i<=n; i++){
int cost=tas[i]-k*cal[i], val=tas[i];
if (cost<0){
cost*=-1;
for (int j=maxw-1; j>=cost; j--)
f[j]=max(f[j], f[j-cost]+val);
}else{
for (int j=maxw-1; j>=cost; j--)
g[j]=max(g[j], g[j-cost]+val);
}
} int ans=0;
for (int i=0; i<maxw; i++)
ans=max(ans, f[i]+g[i]);
printf("%d\n", (ans==0)?-1:ans);
} return 0;
}
Time Memory Length Lang Submitted

最新文章

  1. 从零开始编写自己的C#框架(20)——框架异常处理及日志记录
  2. canvas实现拖动页面时显示窗口视频
  3. iOS实现屏幕旋转
  4. 关于sizeof 跟strlen 的区别
  5. MySQL乱码的几种原因
  6. 记一次DDos攻击--2016/12/8
  7. java8 引进lamda
  8. (转)SQL server 容易让人误解的问题之 聚集表的物理顺序问题
  9. Gym 100531H Problem H. Hiking in the Hills 二分
  10. sencha touch tabsidebar 源码扩展
  11. [POJ 3370] Halloween treats
  12. 修改Tomcat内存大小
  13. 脚本+批处理打造IIS监控器
  14. java转发和重定向
  15. ABP文档笔记系列
  16. C语言获取Linux系统精确时间
  17. input debounce
  18. SqlParameter 多个参数动态拼接解决参数化问题
  19. js时间字符串转为标准时间
  20. WebService和Http的POST和GET请求区别和示例

热门文章

  1. bzoj 2834: 回家的路
  2. [tyvj-1061]Mobile Service 动态规划
  3. C#实现简单的串口通信
  4. 【hdu 6396】Swordsman
  5. BA-siemens-ppm模块调试
  6. JavaWeb应用中的身份验证(声明式)——基于表单的身份认证
  7. unity3d 中动画的帧事件
  8. ACM-SG函数之Fibonacci again and again——hdu1848
  9. Android应用之——微信微博第三方sdk登录分享使用过程中的一些常见问题
  10. 深刻理解Java中的String、StringBuffer和StringBuilder的差别