Codeforces 366C Dima and Salad

http://codeforces.com/problemset/problem/366/C

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

思路:考虑这样DP:f[i][j]:做到第i个水果,平衡度为j,平衡度的表示:Σa[i]-K*Σb[i],这样就可以dp

f[i][j]=max(f[i-1][j],f[i-1][j-a[i]+K*b[i]])

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<iostream>
 6 int f[105][100005],a[1005],b[1005],g[1005][1005];
 7 int n,K;
 8 int read(){
 9     int t=0,f=1;char ch=getchar();
10     while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘) f=-1;ch=getchar();}
11     while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();}
12     return t*f;
13 }
14 int main(){
15     n=read();K=read();
16     for (int i=1;i<=n;i++) a[i]=read();
17     for (int i=1;i<=n;i++) b[i]=read();
18     for (int i=0;i<=n;i++)
19      for (int j=0;j<=500000;j++)
20       f[i][j]=-99999999;
21     f[0][20000]=0;  int cnt=0;
22     for (int i=1;i<=n;i++){
23         cnt++;
24         for (int j=-10000;j<=10000;j++){
25            f[i][j+20000]=std::max(f[i][j+20000],std::max(f[i-1][j+20000],f[i-1][j-a[i]+K*b[i]+20000]+a[i]));
26         }
27     }
28     int ans=-1;
29     if (f[n][20000]) ans=f[n][20000];
30     printf("%d\n",ans);
31     return 0;
32 }
时间: 2024-10-29 00:56:31

Codeforces 366C Dima and Salad的相关文章

codeforces 366C Dima and Salad 【限制性01背包】

<题目链接> 题目大意: 在一个水果篮里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出来一些做一个水果沙拉, 并且要求他的水果沙拉的美味度是卡路里的k倍,问小明是否可以做出这么一个水果沙拉,若不能输出-1,否则输出复合要求的最大的美味值. 解题思路: 题目的限制条件为物品的价值总和与卡路里的比值要为K,这个控制,于是我们将卡路里总和乘到的右边,然后移项,可得(a1-k*b1)+(a2-k*b2)+--+(an-k*bn)=0.因此就将 (ai-k*bi

CF 366C Dima and Salad [天平DP]

题目大意:n个水果,水果有甜度和卡路里两个属性,选择一些水果,使得甜度之和与卡路里之和比例为k,并且使得甜度之和最大 我们可以定义二维dp,dp[当前游标扫到的个数][平衡度]=当前平衡度下最大的ai和,平衡度定义为ai-bi*k,很巧秒的定义方式,可以节省一维时空. 注意到平衡度可正可负(范围在-10000到10000) 我们可以定义如下 int m[1111][22222] int *d[i]=&m[i][10000] dp[num+1][balance]=max(self,dp[num][

codeforces 366C C. Dima and Salad(dp)

题目链接: codeforces 366C 题目大意: 给出n个物品,有两个属性,问最后第一个属性的总和是第二个属性的k倍的时候,第一个属性最大是多少. 题目分析: 我们将物品做一个变形,重量为a[i]-b[i]*k,收益是a,那么我们只需要对重量为正的做一遍背包,对质量为负的取绝对值做一遍背包,然后重量相等的背包的收益之和就是当前重量下的最大收益. AC代码: #include <iostream> #include <cstring> #include <cstdio&g

Codeforces Round #214 (Div. 2)——Dima and Salad

题目链接 题意: 一行a[i],一行b[i],a和b是一一对应的.选取任意个数对,使得sigma(a)/ sigma(b)等于k,求这时候sigma(a)的最大值 分析: 这个题目关键在于对sigma(a)/ sigma(b)== k的处理.对于这种式子,用每个数的比值显然是不行的,因为没法累加:而且是double型,没法DP 考虑一个每个数对对这个式子的影响,如果每个数都是a = k * b,那么显然是可以的:如果a小于k * b,那么在整体中,当前数对少的数肯定要有一些数对来补偿,也就是说,

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

C. Dima and Salad Dima, Inna and Seryozha have gathered in a room. That's right, someone's got to go. To cheer Seryozha up and inspire him to have a walk, Inna decided to cook something. Dima and Seryozha have n fruits in the fridge. Each fruit has t

Codeforces Round #214 (Div. 2)---C. Dima and Salad

Dima, Inna and Seryozha have gathered in a room. That's right, someone's got to go. To cheer Seryozha up and inspire him to have a walk, Inna decided to cook something. Dima and Seryozha have n fruits in the fridge. Each fruit has two parameters: the

CodeForces 584D Dima and Lisa

1e9 以内的判断一个数是否是素数,可以直接朴素的暴力. 这倒题除了考虑1e9以内的素数的判断,还有一个歌德巴赫猜想:任意一个奇数都可一分解为三个素数的和. 第三个结论:素数是密集的,1e9以内,相邻的素数之间的间隔不会大于300,所以直接枚举也不会浪费掉太多的时间. 这里还有一点需要注意的是:朴素的判断是否是素数,i<=saqrt(n).今天的天梯赛由于记错了这个条件,导致没有求出素数,一道二十分的题没有做,好伤心. Dima and Lisa Time Limit:1000MS     Me

Codeforces 358D. Dima and Hares (dp)

题目链接: http://codeforces.com/problemset/problem/358/D 题意: 给出n个数,每个数取走的贡献与相邻的数有关,如果取这个数的时候,左右的数都还没被取,那么权值为a,如果左右两个数有一个被取走了,那么权值为b,如果左右两个数都被取走了,那么权值为c,求取取走全部数的最大值. 思路: from: http://blog.csdn.net/qq_24451605/article/details/48896657 定义状态: dp[i][1][0]表示选第

CodeForces 358E - Dima and Kicks

dfs判断欧拉图,红名选手的代码就是炫酷. 首先统计所有点的度数总和,而后对于这张图的特殊性--每个点最多只会有四条边,来标记当前边是否走过了. 若在一次DFS中,能遍历所有的节点则输出所有边长的gcd的大于1的约数集. 真心学习了. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include &