• P1417 烹调方案


    P1417 烹调方案
    题目提供者tinylic
    标签 动态规划
    难度 普及+/提高
    题目背景
    由于你的帮助,火星只遭受了最小的损失。但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星。不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的食物准备填饱肚子。gw希望能在T时间内做出最美味的食物,但是这些食物美味程度的计算方式比较奇葩,于是绝望的gw只好求助于你了。
    题目描述
    一共有n件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间。
    众所周知,gw的厨艺不怎么样,所以他需要你设计烹调方案使得美味指数最大
    输入输出格式
    输入格式:
    第一行是两个正整数T和n,表示到达地球所需时间和食材个数。
    下面一行n个整数,ai
    下面一行n个整数,bi
    下面一行n个整数,ci
    输出格式:
    输出最大美味指数
    输入输出样例
    输入样例#1:
    74 1
    502
    2
    47
    输出样例#1:
    408
    说明
    【数据范围】
    对于40%的数据1<=n<=10
    对于100%的数据1<=n<=50
    所有数字均小于100,000
    【题目来源】
    tinylic改编

    /*
    W&T.
    读错题目了啊啊啊啊啊啊.
    (每种食材只能用一次QWQ)
    把所有情况处理了出来背包DP.
    */
    #include<iostream>
    #include<cstdio>
    #define MAXN 51
    #define MAXM 100001
    #define LL long long
    using namespace std;
    LL f[MAXM],n,t,a[MAXN],b[MAXN],c[MAXN],w[MAXN*MAXM],tot,v[MAXN*MAXM];
    LL read(){
        LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void init(){
        t=read();n=read();
        for(int i=1;i<=n;i++)  a[i]=read();
        for(int i=1;i<=n;i++)  b[i]=read();
        for(int i=1;i<=n;i++)  c[i]=read();
    }
    void slove(){
        for(int i=1;i<=n;i++)
          for(int j=1;j<=t;j++){
            w[++tot]=a[i]-j*b[i];
            v[tot]=c[i];
          }
    }
    void dp(){
        for(int i=1;i<=tot;i++)
            for(int j=t;j>=v[i];j--)
        {
              f[j]=max(f[j],f[j-v[i]]+w[i]);
            printf("%d ",f[j]);
        }
        printf("%d",f[t]);
    }
    int main(){
        init();
        slove();
        dp();
        return 0;
    }
    
    /*
    DP+贪心.
    (国王游戏类似).
    可以考虑有两个菜的三值分别为a1,b1,c1,a2,b2,c2
    则两种情况为a1-(t+c1)*b1+a2-(t+c1+c2)*b21)
           a2-(t+c2)*b2+a1-(t+c1+c2)*b12)
    如果(1)>(2)则化简得c1*b2<c2*b1.
    按照这个条件排序之后跑一边01背包.
    */
    #include<iostream>
    #include<cstdio>
    #define MAXN 51
    #define LL long long
    #define MAXM 100001
    using namespace std;
    LL f[MAXM],n,t,a[MAXN],b[MAXN],c[MAXN],w[MAXN*MAXM],tot,v[MAXN*MAXM];
    LL read(){
        LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void init(){
        t=read();n=read();
        for(int i=1;i<=n;i++)  a[i]=read();
        for(int i=1;i<=n;i++)  b[i]=read();
        for(int i=1;i<=n;i++)  c[i]=read();
    }
    void slove(){
        for(int i=1;i<=n;i++)
          for(int j=i+1;j<=n;j++){
            if(b[i]*c[j]<b[j]*c[i]){
                LL tmp=b[i];b[i]=b[j];b[j]=tmp;
                tmp=c[j];c[j]=c[i];c[i]=tmp;
                tmp=a[i];a[i]=a[j];a[j]=tmp;
            }}
    }
    void dp(){
        for(int i=1;i<=n;i++){
            for(int j=t;j>=c[i];j--)
              f[j]=max(f[j],f[j-c[i]]+a[i]-j*b[i]);
        }
        for(int i=1;i<=t;i++) f[0]=max(f[0],f[i]);
        printf("%d",f[0]);
    }
    int main()
    {
        init();
        slove();
        dp();
        return 0; 
    }
  • 相关阅读:
    单片机基础
    EM310_AT收到的短信分析
    [原]改动CImage以实现以指定的质量保存Jpeg图像
    [原创]巧用DOS命令改子目录中的文件名
    二个月零七天,我女儿会翻身了
    [原]用正则得到HTML中所有的图片路径
    新文章:把程序放在相册中
    [原]用三行代码实现对音量的控制,实现增大,减小,静音
    BIOS中隐藏Telnet后门
    CoolChm 注册机的编写
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070801.html
Copyright © 2020-2023  润新知