【codevs 1025】选菜
来源:互联网 发布:差评师淘宝怎么处理 编辑:程序博客网 时间:2024/06/06 08:35
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≤n≤100),k(0≤k≤实际菜的种类)和一个实数X(0≤X≤100),表示有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
数据范围及提示 Data Size & Hint
DP01背包
注意必选菜、重复菜
注意价格!!
倒着转移保证合法
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 105;const int MAXM = 10005;int n,k,m,mon,s,ss = 0;int v[MAXN],fff[MAXM];double x,p[MAXN];bool viv[MAXN];struct edge{ int p,v;}num[MAXN];int main(){ scanf("%d %d %lf",&n,&k,&x); for(int i = 1; i <= n; i ++) scanf("%lf",&p[i]); for(int i = 1; i <= n; i ++) scanf("%d",&v[i]); for(int i = 1; i <= n; i ++) { scanf("%d",&m); num[m].p = p[i] * 10; num[m].v = v[i]; viv[m] = true; } mon = x * 10; for(int i = 1; i <= k; i ++) { scanf("%d",&m); if(viv[m] == true) { mon -= num[m].p; s += num[m].v; viv[m] = false; } } for(int i = 1; i <= n; i ++) if(viv[i] == true)//*************** for(int j = mon; j >= num[i].p; j --) fff[j] = max(fff[j],fff[j - num[i].p] + num[i].v); for(int i = 0; i <= mon; i ++) ss = max(ss,fff[i]); ss += s; printf("%d\n",ss); return 0;}
- 【codevs 1025】选菜
- 1025 选菜(codevs)
- Codevs 1025 选菜
- CODEVS 1025 选菜
- Codevs 1025 选菜
- codevs 1025 选菜 背包问题 解题报告
- Codevs p1025 选菜
- codevs天梯 选菜
- codevs动态规划 选菜
- Codevs
- 20160317 CodeVS 1025 选菜,1102 采药,3324 新斯诺克
- codevs 1060
- [CodeVS]3304
- codevs 4248
- Codevs 苹果树
- Codevs 挂缀
- Codevs 加密算法
- CodeVs 1011
- (useAffectedRows)Mysql / Mybatis update时,字段不变返回值的问题
- python装饰器
- 关于数据库的一些易犯错的总结
- linux下yum安装mysql
- 基于主成分(pca)与思维进化(mea)优化神经网络算法的股票预测
- 【codevs 1025】选菜
- 函数的练习题
- RSA算法原理(二)
- CentOS6.5 搭建LNMP
- android 视频开发 集成vitamio 播放rtsp m3u8 视频 有图有demo
- 使用jdbc实现简单的用户登录
- ViewPager的简单优化和实现大图轮播
- RSA算法原理(一)
- vim8.0 ubuntu 安装 && 使用vimplus安装插件