CodeForces-366C Dima and Salad 对01背包的理解 多个背包问题
题目链接:https://cn.vjudge.net/problem/CodeForces-366C
题意
给出n个水果和一个常数k,其中每个水果都有两种性质ai, bi(美味度,卡路里量)。
要保证$ \frac{ \sum a_i }{ \sum b_i }=k $的前提下,求出最大的ai和。
思路
不知道是什么背包类型,这类背包是这样的:多个基础的01背包(或其他)
- 对单个背包的理解是这样:
在一元不定式的约束,且dp函数具有单调性时,dp函数值最大化。
比如01背包是这样的:
在总代价小于某值,且dp[cost]=val中cost越大val一定不会变小时(容量越大,能选的价值越大),价值最大化 - 明显这题不满足「一元不定式的约束」。
于是我们就可以想办法把问题拆成两个背包,或者改成两个状态dp[taste][calories]。
虽然明显后一个状态将超时。 - 如果拆成两个背包,就必须满足「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 |
---|
CodeForces-366C Dima and Salad 对01背包的理解 多个背包问题的更多相关文章
- CodeForces - 366C Dima and Salad (01背包)
题意:n件东西,有属性a和属性b.要选取若干件东西,使得\(\frac{\sum a_j}{\sum b_j} = k\).在这个条件下,问\(\sum a_j\)最大是多少. 分析:可以将其转化为0 ...
- Codeforces 366C Dima and Salad:背包dp
题目链接:http://codeforces.com/problemset/problem/366/C 题意: 有n个物品,每个物品有两个属性a[i]和b[i]. 给定k,让你选出一些物品,使得 ∑ ...
- codeforces 366C Dima and Salad 【限制性01背包】
<题目链接> 题目大意: 在一个水果篮里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出来一些做一个水果沙拉, 并且要求他的水果沙拉的美味度是卡路里 ...
- cf 366C C. Dima and Salad(01背包)
http://codeforces.com/contest/366/problem/C 题意:给出n个水果的两种属性a属性和b属性,然后挑选苹果,选择的苹果必须要满足这样一个条件:,现在给出n,k,要 ...
- Codeforces 366C Dima and Salad
http://codeforces.com/problemset/problem/366/C 题意:在一个冰箱里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出 ...
- codeforces-214(Div. 2)-C. Dima and Salad+DP恰好背包花费
codeforces-214(Div. 2)-C. Dima and Salad 题意:有不同的沙拉,对应不同的颜值和卡路里,现在要求取出总颜值尽可能高的沙拉,同时要满足 解法:首先要把除法变成乘法, ...
- 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论
一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...
- 01背包(分组) HDOJ 4341 Gold miner
题目传送门 题意:有n个金矿,每个金矿有抓取的消耗的时间和价值,矿工在原点,问在T时间内能得到的最大的价值 分析:唯一和01背包不同的是金矿可能共线,也就是抓取近的金矿后才能抓后面共线的金矿.这是分组 ...
- 杭电 2639 Bone Collector II【01背包第k优解】
解题思路:对于01背包的状态转移方程式f[v]=max(f[v],f[v-c[i]+w[i]]);其实01背包记录了每一个装法的背包值,但是在01背包中我们通常求的是最优解, 即为取的是f[v],f[ ...
随机推荐
- nyoj28-大数阶乘
大数阶乘 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0& ...
- freeswich 安装mod_av
转载 https://www.cnblogs.com/zgen1/p/7867303.html 需要先编译libav库 编译libav下载:git clone https://freeswitch ...
- Linux 中常用的基础命令二
1.Linux文件分层结构 FHS:Linux有一个组织叫LSB定义的Linux发行版基础目录名称命名法则及功用规定,这种标准叫FHS文件系统层级标准./bin 存放可执行的二进制程序,管理员和 ...
- 一次 Laravel 性能分析全程笔记
大家都知道 laravel 项目写起来是挺爽,但是在生产环境性能不高,我们来抽丝剥茧分析我自己项目的运行时间消耗: Bootstrap 耗时 步骤 耗时 Illuminate\Foundation\B ...
- Asp.Net IHttpHandler介绍
ASP.NET响应Http请求时常用的两个处理接口是IHttpHandler和IHttpModule. 一般的,IHttpHandler用来处理一类特定的请求,比如对每个*.asp, *.aspx文件 ...
- 工具-常用VS插件
工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环节, ...
- D - Constructing Roads
D - Constructing Roads 思路:并查集板子 #include<cstdio> #include<cstring> #include<iostream& ...
- [SharePoint2010开发入门经典]二、开始SPS2010开发
本章概要: 1.了解SPS2010开发要素(包括工具,平台服务,开发选项) 2.熟悉主要开发工具和部署方案 3.安装.配置.简单开发案例 4.理解网站级别的安全设置
- mysql安装出错cannot create windows service for mysql.error:0
配置时最后一步出现不能启动mysql 解决成功的办法:[MySQL] Could not start the service MySQL 解决方法 安装mysql 5.1.33,在运行Server I ...
- Android 零基础学习之路
第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正則表達式. 3.面向对象的抽象.封装,继承,多态.类与对象.对象初始化 ...