codevs 1025 选菜 背包问题 解题报告
来源:互联网 发布:python kmeans 编辑:程序博客网 时间:2024/06/06 00:44
题目描述 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
思路
创建两组数组,一组读入时用。另一组在知道编号之后,把相应的数据放到对应编号的数组里,并进行标记,方便处理。
同时将价钱*10,方便变成下标,进行处理。
剩下的就是标注的背包问题了。
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>using namespace std;const int N=100+5;int flag[N],price[N],price_use[N],taste[N],taste_use[N],kind[N];int dp[N*10],n,k,have,m;double x1,now;int max(int x,int y){ if (x>=y) return x; else return y;}int main(){ scanf("%d%d%lf",&n,&k,&x1); have=(int)(x1*10); int ans=0; for (int i=1;i<=n;i++) { scanf("%lf",&now); price[i]=(int)(now*10); } for (int i=1;i<=n;i++) scanf("%d",&taste[i]); for (int i=1;i<=n;i++) { scanf("%d",&kind[i]); flag[kind[i]]=1; price_use[kind[i]]=price[i]; taste_use[kind[i]]=taste[i]; } for (int i=1;i<=k;i++) { scanf("%d",&m); flag[m]=0; ans+=taste_use[m]; have-=price_use[m]; } for (int i=1;i<=n;i++) if (flag[i]==1) { for (int j=have;j>=price_use[i];j--) dp[j]=max(dp[j-price_use[i]]+taste_use[i],dp[j]); } printf("%d\n",dp[have]+ans); return 0;}
- codevs 1025 选菜 背包问题 解题报告
- codevs 1620 轮船问题 DP 解题报告
- 背包问题 2 完全背包解题报告
- 背包问题 3 多重背包 解题报告
- Backpack 解题报告 背包问题深入浅出
- 01背包问题的解题报告
- codevs 2602 最短路径问题 Floyd 解题报告
- codevs 1231 最优布线问题 并查集 解题报告
- codevs 1282 约瑟夫问题 大暴力? 解题报告
- codevs 1282 约瑟夫问题 树状数组正解 解题报告
- codevs 1464 装箱问题2 模拟 解题报告
- [CODEVS]数据结构系列 解题报告
- CODEVS 1022 覆盖 解题报告
- [codevs 1515]跳 【解题报告】
- Codevs 1251 括号 解题报告
- Codevs 1557 热浪 解题报告
- CodeVS 2370 LCA 解题报告
- codevs 1006 等差数列 解题报告
- js基本语句
- opencv: 颜色空间转换(cv2.cvtColor) 探究(图示+源码)
- java中处理高精度大数字的类 BigDecimal, BigInteger
- TCP三次握手和四次挥手详解
- base64ToFile和fileToBase64
- codevs 1025 选菜 背包问题 解题报告
- android深入解析Activity的launchMode启动模式,Intent Flag,taskAffinity
- 为什么说TCP报文段是面向字节流的,UDP包是面向数据报的
- gSOAP编译和学习
- 欢迎使用CSDN-markdown编辑器
- 夜灵的Html笔记Day03——列表、H5结构标记、表单、Iframe
- 软件测试的管理问题
- jsonp
- 动态规划 ② HDU