<题目链接>

题目大意:

在一个水果篮里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出来一些做一个水果沙拉, 并且要求他的水果沙拉的美味度是卡路里的k倍,问小明是否可以做出这么一个水果沙拉,若不能输出-1,否则输出复合要求的最大的美味值。

解题思路:

题目的限制条件为物品的价值总和与卡路里的比值要为K,这个控制,于是我们将卡路里总和乘到的右边,然后移项,可得(a1-k*b1)+(a2-k*b2)+……+(an-k*bn)=0。因此就将 (ai-k*bi)作为物品i的一个新的属性,就将本问题转化为了01背包问题, 将(ai-k*bi)看成物品的重量,ai为物品的价值,0为背包的总容量。但是如果这样的话,(ai-k*bi)会出现负数。

为了处理这个问题,有两种处理方案;

一:将等式两边同时+N,使得 (ai-k*bi)全部为正

二:用两个dp,正的跑一遍,负的跑一遍,然后在把它们相加就是答案,至于题目的限制条件,则可以通过取相同的 i 值来实现,因为dd[i]中的体积 i 为实际体积的相反数。

下面的是第二种方案:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std; const int maxn = ;
#define INF 0x3f3f3f3f
int dp[maxn], dd[maxn];
struct node
{
int val, k;
int cnt;
}; int main()
{
int n, m;
while (scanf("%d %d", &n, &m) != EOF)
{
node arr[];
for (int i = ; i <= n; i++)
scanf("%d", &arr[i].val);
for (int i = ; i <= n; i++)
{
scanf("%d", &arr[i].k);
arr[i].cnt = arr[i].val - m * arr[i].k;
} memset(dp, -INF, sizeof(dp)); //初始化为负无穷是为了能够使dp[j]表示恰好装满 i 体积的情况
memset(dd, -INF, sizeof(dd));
dp[] = dd[] = ;
for (int i = ; i <= n; i++)
{
if (arr[i].cnt >= )
{
for (int j = ; j >= arr[i].cnt; j--)
{
dp[j] = max(dp[j], dp[j - arr[i].cnt] + arr[i].val);
}
}
else
{
arr[i].cnt = -arr[i].cnt;
for (int j = ; j >= arr[i].cnt; j--)
{
dd[j] = max(dd[j], dd[j - arr[i].cnt] + arr[i].val);
}
}
} int ans = -0x3f;
for (int i = ; i <= ; i++)
{
if (dp[i] == && dd[i] == )continue; //因为ans初始化为-0x3f,所以要跳过dp[0]==dd[0]==0的情况
ans = max(ans, dd[i] + dp[i]); //因为dp[i],dd[i]表示恰好装满i容量的最大价值,所以,题目的限制条件:(ai-k*bi)的总和=0,就可以通过dd[i],dp[i]取相同的i值来实现
}
ans == -0x3f ? printf("-1\n") : printf("%d\n", ans); }
return ;
}

2018-07-28

codeforces 366C Dima and Salad 【限制性01背包】的更多相关文章

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

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

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

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

  3. CodeForces-366C Dima and Salad 对01背包的理解 多个背包问题

    题目链接:https://cn.vjudge.net/problem/CodeForces-366C 题意 给出n个水果和一个常数k,其中每个水果都有两种性质ai, bi(美味度,卡路里量). 要保证 ...

  4. cf 366C C. Dima and Salad(01背包)

    http://codeforces.com/contest/366/problem/C 题意:给出n个水果的两种属性a属性和b属性,然后挑选苹果,选择的苹果必须要满足这样一个条件:,现在给出n,k,要 ...

  5. Codeforces 366C Dima and Salad

    http://codeforces.com/problemset/problem/366/C 题意:在一个冰箱里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出 ...

  6. codeforces-214(Div. 2)-C. Dima and Salad+DP恰好背包花费

    codeforces-214(Div. 2)-C. Dima and Salad 题意:有不同的沙拉,对应不同的颜值和卡路里,现在要求取出总颜值尽可能高的沙拉,同时要满足 解法:首先要把除法变成乘法, ...

  7. hdu 3466 Proud Merchants 【限制性01背包】+【贪心】

    题目链接:https://vjudge.net/contest/103424#problem/J 转载于:https://www.bbsmax.com/A/RnJW16GRdq/ 题目大意: 有n个商 ...

  8. 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 ...

  9. CF#214 C. Dima and Salad 01背包变形

    C. Dima and Salad 题意 有n种水果,第i个水果有一个美味度ai和能量值bi,现在要选择部分水果做沙拉,假如此时选择了m个水果,要保证\(\frac{\sum_{i=1}^ma_i}{ ...

随机推荐

  1. UBUNTU18.04安装网易云音乐并直接图标启动

    这是一个网友改的程序,安装好以后把 ~/.cache/netcase-cloud-music 这个目录删除掉,就可以正常使用了,不用root权限

  2. 第16月底18天 phpstudy设置

    1.phpstudy设置-端口常规设置 E:\phpStudy\Apache\bin>httpd.exeAH00526: Syntax error on line 14 of E:/phpStu ...

  3. H.264 SVC

    视频厂商POLYCOM,VIDYO和RADVISION等都推出H.264 SVC技术.针对H.264 SVC技术做个介绍. CISCO和POLYCOM都提供了免版税的H.264 SVC的版本. 其中o ...

  4. jira7.3.6添加导出excel的按钮

    在 jira的application-data 文件夹下 jira-config.properties 文件(如果没有就创建一个) 中添加以下内容:jira.export.excel.enabled= ...

  5. 利用 python requests完成接口文件上传

    最近在准备一个公开课,主题就是利用不同的语言和不同的工具去实现文件的上传和下载. 在利用Jmeter去实现功能的时候,以及利用loadrunner去写脚本的时候,都很顺利,没有任何问题,当我尝试用Py ...

  6. mysql 案例~关于pt-osc工具的用途

    简介:今天咱们聊聊PT-OSC的东东一 简单介绍  1 标准组合   pt-online-schema-change --user= --password= --host= D=,t= --sock= ...

  7. js实现获取两个日期之间所有日期最简单的方法

    Date.prototype.format = function() { var s = ''; var mouth = (this.getMonth() + 1)>=10?(this.getM ...

  8. 启动apache 提示Starting httpd: AH00558

    Starting httpd: AH00558: httpd: Could not reliably determine the server's fully qualified domain nam ...

  9. Linux内核基础设施

    1.前言 本文主要介绍Linux内核实现的基本数据类型,包括链表,内核对象,内核对象引用计数,内核对象集合, 2.链表 1. 链表的基本结构 内核链表可以将任何类型的数据结构连接起来,链表结构如下: ...

  10. centos 6.5内核编译步骤及配置详解

    1.准备并加压内核安装包:linux-3.13.2.tar.xz # tar xf linux-3.13.2.tar.xz -C /usr/src # cd /usr/src/ # ln -sv li ...