• 洛谷 1417——烹调方案【动规】


    题目背景
    由于你的帮助,火星只遭受了最小的损失。但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


    首先按照美味指数大小排序
    设f[i][j]为前i件食品用j时间的最大美味指数
    其实就是一个类似于完全背包的dp
    状态转移方程:f[i,j]:=max(f[i-1,j],f[i-1,j-c[i]]+a[i]-j*b[i])


    代码如下:

    var
      t,n,i,j,k,t1,ans:int64;
      a,b,c:array[0..51] of int64;
      f:array[0..51,0..100000] of int64;             
    function max(a,b:int64):int64;                   
    begin
      if a>b then exit(a) else exit(b);
    end;
    begin
      read(t,n);
      for i:=1 to n do read(a[i]);                      
      for i:=1 to n do read(b[i]);
      for i:=1 to n do read(c[i]);                 
      for i:=1 to n-1 do
        for j:=i+1 to n do
          if c[i]*b[j]>c[j]*b[i] then  
            begin
              t1:=a[i]; a[i]:=a[j]; a[j]:=t1;
              t1:=b[i]; b[i]:=b[j]; b[j]:=t1;
              t1:=c[i]; c[i]:=c[j]; c[j]:=t1;          
            end;
      for i:=1 to n do
        for j:=0 to t do
          if j-c[i]>=0 then f[i,j]:=max(f[i-1,j],f[i-1,j-c[i]]+a[i]-j*b[i])else f[i,j]:=f[i-1,j];                                        
      for i:=0 to t do ans:=max(ans,f[n,i]);                       
      writeln(ans);
    end.
  • 相关阅读:
    自签证书的创建与导入
    Linux常用命令
    JS数据类型
    call和apply
    css浮动Float
    vue 列表进入详情后,返回保持原位置
    vue-cli2升级为vue-cli3
    html2canvas使用中的小问题
    jquery点击空白处关闭弹窗
    template.js中template模板中onclick传参
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412298.html
Copyright © 2020-2023  润新知