codevs动态规划 选菜

    在小松宿舍楼下的不远处,有PK大学最不错的一个食堂——The Farmer’s Canteen(NM食堂)。由于该食堂的菜都很不错,价格也公道,所以很多人都喜欢来这边吃饭。The Farmer’s Canteen的点菜方式如同在超市自选商品一样,人们从一个指定的路口进去,再从一个指定的路口出来并付款。由于来这里就餐的人数比较多,所以人们自觉地在进入口的时候就排成一个长队,沿着长长的摆放着各式各样佳肴的桌子进行选菜。

       小松发现,这种选菜方式意味着,他不能在选菜的时候离开队伍去拿一些他已经看过了的菜或者没有看过的菜,因为插队是不礼貌的,也是被BS的。

       每个菜有一个价值,而小松也自己给每个菜定了一个在他看来的美味价值,例如红烧小黄鱼在小松看来是美味价值很高的,而花菜在小松眼里则是美味价值极低的菜肴。而有一些菜是营养价值极其高的菜(例如米饭),所以无论它的美味价值是多少,小松都会选择1份。现在小松带了X元钱来食堂就餐,他想知道,在不欠帐的情况下,他选菜的美味价值总合最大是多少。

分析:就是一道无脑的01动态规划,只要预处理是将数据整数化就好了。

var 

    n,k,i,j,lim,tot,tmp1,kind,ans:longint;


    tmp,lim1:extended;


    f:array[0..1000,0..1000] of longint;


    a,bh,cost,value:array[0..1000] of longint;


    map:array[0..100] of boolean;


begin


  read(n,k,lim1);


  fillchar(map,sizeof(map),0);


  lim:=round(lim1*10);


  for i:=1 to n do begin read(tmp);cost[i]:=round(tmp*10); end;


  for i:=1 to n do begin read(tmp);value[i]:=round(tmp*10);end;


  for i:=1 to n do


    begin


      read(kind);


      if not map[kind] then


        begin


          map[kind]:=true;


          inc(tot);


          a[tot]:=i;


          bh[kind]:=tot;


        end;


    end;


  ans:=0;


  for i:=1 to k do


    begin


      read(tmp1);


      inc(ans,value[a[bh[tmp1]]]);


      value[a[bh[tmp1]]]:=0;


      dec(lim,cost[a[bh[tmp1]]]);cost[a[bh[tmp1]]]:=lim+1;


    end;


  for i:=1 to tot do


    begin


      for j:=1 to lim do


        begin


          f[i,j]:=f[i-1,j];


          if j>=cost[a[i]]


            then if f[i,j]<f[i-1,j-cost[a[i]]]+value[a[i]] then


              f[i,j]:=f[i-1,j-cost[a[i]]]+value[a[i]];


        end;


    end;


  if round((f[tot,lim]+ans)/10)=(f[tot,lim]+ans)/10


    then writeln((f[tot,lim]+ans)/10:0:0)


    else writeln((f[tot,lim]+ans)/10:0:1);


end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值