CODEVS【1025】选菜

1025 选菜

时间限制: 1 s  空间限制: 128000 KB   题目等级 : 黄金 Gold

题目描述 Description

在小松宿舍楼下的不远处,有PK大学最不错的一个食堂——The Farmer’s Canteen(NM食堂)。由于该食堂的菜都很不错,价格也公道,所以很多人都喜欢来这边吃饭。The Farmer’s Canteen的点菜方式如同在超市自选商品一样,人们从一个指定的路口进去,再从一个指定的路口出来并付款。由于来这里就餐的人数比较多,所以人们自觉地在进入口的时候就排成一个长队,沿着长长的摆放着各式各样佳肴的桌子进行选菜。

小松发现,这种选菜方式意味着,他不能在选菜的时候离开队伍去拿一些他已经看过了的菜或者没有看过的菜,因为插队是不礼貌的,也是被BS的。

每个菜有一个价值,而小松也自己给每个菜定了一个在他看来的美味价值,例如红烧小黄鱼在小松看来是美味价值很高的,而花菜在小松眼里则是美味价值极低的菜肴。而有一些菜是营养价值极其高的菜(例如米饭),所以无论它的美味价值是多少,小松都会选择1份。现在小松带了X元钱来食堂就餐,他想知道,在不欠帐的情况下,他选菜的美味价值总合最大是多少。

输入描述 Input Description

请从输入文件farmer.in中读入相关数据。输入的第一行包括两个个整数n(1≤n100),k(0k实际菜的种类)和一个实数X(0≤X100),表示有n个菜式,有k种菜是必选的,小松带来了X元钱(精确到“角”)。接下来的1行包含n个实数,表示菜桌上从入口到出口的所有菜的价格(0价格10,单位“元”,精确到“角”);再接下来的1行包含n个整数,表示菜桌上从入口到出口的所有菜的美味价值(0美味价值100);再接下来一行包含n个整数,表示菜桌上从入口到出口的所有菜的种类编号(1种类编号100)。最后一行包含k个整数分别表示必选菜的种类编号。要注意的是,同一种编号的菜可以出现多次,但是他们的价格和美味价值都是一样的。对于同一种菜(无论是不是必选菜),小松最多只会选择1份(买两份红烧豆腐多没意思啊)。另外,必选菜的价格之和一定不超过X

输出描述 Output Description

请将结果输出到输出文件farmer.out中。输出包含一个整数,表示小松能选到的菜的美味价值总和最大是多少。

   注:你可以假设数据中不会出现小松带的钱不够买必买菜的情况。

样例输入 Sample Input

7 1 5.0

4 1 3 0.9 2 0.5 0.9

7 3 5 2 5 0 2

6 3 5 2 4 1 2

2

样例输出 Sample Output

10

这道题是一个有限制的背包DP,所以我们只需要加上限制即可。

用一个vis数组表示这种菜是否已经被选,读入数据时,把已选用的菜的vis值赋为1,接着背包DP即可,但要注意要把菜的价格以及所有金钱×10变为整数,否则背包DP时会出现死循环……

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<vector>
 6 #include<algorithm>
 7 #include<cstring>
 8 #include<vector>
 9 #include<map>
10 #include<stack>
11 #define maxn 100+50
12 #define inf 0x7fffffff
13 #define  xiao 1e-9
14 using namespace std;
15 int n,k,w[maxn],kind[maxn],dp[10*maxn];
16 int money,price[maxn],vis[maxn],price_[maxn],w_[maxn];
17 int main()
18 {
19     int ans=0;
20     int num;
21     double money1;
22     scanf("%d%d%lf",&n,&k,&money1);
23     money=money1*10;
24     for(int i=1;i<=n;++i)  scanf("%lf",&money1),price[i]=money1*10;
25     for(int i=1;i<=n;++i) scanf("%d",&w[i]);
26     for(int i=1;i<=n;++i)
27     {
28         scanf("%d",&kind[i]);
29         vis[kind[i]]=1;
30         price_[kind[i]]=price[i];
31         w_[kind[i]]=w[i];
32     }
33     for(int i=1;i<=n;++i) vis[i]=1;
34     for(int i=1;i<=k;++i)
35     {
36         scanf("%d",&num);
37         vis[num]=0;
38         money-=price_[num];
39         ans+=w_[num];
40  }
41     for(int i=1;i<=n;++i)
42       {
43           if(vis[i])
44              for(int j=money;j>=price_[i];j--)
45              {
46                    dp[j]=max(dp[j],dp[j-price_[i]]+w_[i]);
47              }
48       }
49       cout<<dp[money]+ans;
50       return 0;
51 }
52
53
54
55     

code code oi oi

时间: 2024-10-11 10:18:38

CODEVS【1025】选菜的相关文章

Codevs 1025 选菜

1025 选菜 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在小松宿舍楼下的不远处,有PK大学最不错的一个食堂——The Farmer’s Canteen(NM食堂).由于该食堂的菜都很不错,价格也公道,所以很多人都喜欢来这边吃饭.The Farmer’s Canteen的点菜方式如同在超市自选商品一样,人们从一个指定的路口进去,再从一个指定的路口出来并付款.由于来这里就餐的人数比较多,所以人们自觉地在进入口的时候就排

1025 选菜

1025 选菜 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在小松宿舍楼下的不远处,有PK大学最不错的一个食堂——The Farmer’s Canteen(NM食堂).由于该食堂的菜都很不错,价格也公道,所以很多人都喜欢来这边吃饭.The Farmer’s Canteen的点菜方式如同在超市自选商品一样,人们从一个指定的路口进去,再从一个指定的路口出来并付款.由于来这里就餐的人数比较多,所以人们自觉地在进入口的时候就排

codevs 3372 选学霸(hash+并查集+多重背包)

先通过并查集处理出来有多少种不同的集合,每个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候可以通过hash处理出来每个数目相同的集合的个数. 这样以人数为权值,个数为限制进行多重背包,结果就是答案. 题目链接:http://codevs.cn/problem/3372/ #include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #in

codevs——1008 选数

1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在,要求你计算出

CODEVS 1008选数

题目描述 Description 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在,要求你计算出和为素数共有多少种. 例如上例,只有一种的和为素数:3+7+19=29). 输入描述 Input Description 键盘输入,格式为

codevs 1008 选数

题目描述 Description 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在,要求你计算出和为素数共有多少种. 例如上例,只有一种的和为素数:3+7+19=29). 输入描述 Input Description 键盘输入,格式为

VUE新版扫码下单必选分类设置FAQ

使用场景:商家想要设置某些分类下的商品设置必选,否则不能下单.如某火锅店,商家想要设置汤底这个分类下的商品,顾客扫码下单的时候必须选择一份才能下单,此时 就可以使用这个功能 配置步骤和注意事项如下: 配置步骤(这里的分类以"主食"为例): 一.登录新商家中心("必选分类"这个功能配置仅在新商家中心支持,老版商家后台不支持) 1.商品管理--开台设置--开台分类--点击添加开台必选分类 2.分类下商品必选份数和选择分类配置: 如下图所示:我设置"分类下商品必

Android学习笔记(34):Android菜单

Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Menu).子菜单(Sub Menu). 选项菜单(Option Menu):按设备上的菜单按钮(Menu)会出现的菜单.不支持勾选标记. 上下文菜单(Context Menu):长按某个组件会出现的菜单.不支持菜单项图标. 子菜单(SubMenu):就是子菜单.不支持菜单项图标,不支持嵌套子菜单. Menu类用于添加菜单项和子菜单的方法是add()和addSubMenu(): MenuItem a

2015年春季开学前的感想

时间过的很快,又要开学了,明天是全体行政人员上班开会.在上班前总想写点东西,但是又不知道该写点啥,所以以下都是一些没啥逻辑的言语. 现在已经是2015年了,我2013年毕业,工作已经一年半了.现在回想一下,在这一年半中,自己在工作中确实有所成长,不论是工作能力还是为人处世,以及自己的世界观,都有所提升.工作后,被分到学校的总务处,干的是基建专干的工作,基建专干的工作范围是:学校的土建.装修.水电.校园安全巡查.各种报修的处理等,我还要负责学校校园安防监控.每个办公室的电话.学校的电梯维护等.才工