• 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

    #include<stdio.h>
    int p1[105],mark[105],d1[105],p[105],d[105],s[1000];
    int main()
    {
        int n,k,ans=0,x;
        float x1;
        scanf("%d%d%f",&n,&k,&x1);
        x=x1*10;
        for(int i=1; i<=n; i++)
        {
            float z;
            scanf("%f",&z);
            p1[i]=10*z;
        }
        for(int i=1; i<=n; i++)
            scanf("%d",&d1[i]);
        for(int i=1; i<=n; i++)
        {
            int y;
            scanf("%d",&y);//在这里把有的编码做处理
            p[y]=p1[i];
            d[y]=d1[i];
            mark[y]=1;
        }
        for(int i=1; i<=k; i++)
        {
            int y;
            scanf("%d",&y);
            if(mark[y])//注意编码有重复的
            {
                x-=p[y];
                ans+=d[y];
            }
            mark[y]=0;
        }
        for(int j=1; j<=n; j++)
            for(int i=x; i>=p[j]; i--)
                if(mark[j]&&s[i-p[j]]+d[j]>s[i])
                    s[i]=s[i-p[j]]+d[j];
        printf("%d",s[x]+ans);
        return 0;
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    C语言 汉诺塔问题
    指向函数的指针 linux中常见的函数指针应用及函数指针数组
    C语言 折半/二分法查找
    C语言 stdlib.h自带函数库:qsort()排序,简称"快排"
    几种排序算法的稳定性归纳
    C语言 归并排序
    c语言 堆排序 多函数处理法
    C语言 递归方法实现快速排序
    C语言 通过输出排序次数来比较希尔排序和插入排序的优劣
    c语言 希尔排序简化函数版
  • 原文地址:https://www.cnblogs.com/l609929321/p/6759360.html
Copyright © 2020-2023  润新知