codevs動態規劃 選菜

2021-07-27 23:18:26 字數 1742 閱讀 7967

在小松宿舍樓下的不遠處,有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,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.

CODE VS 1025 選菜 揹包

在小松宿舍樓下的不遠處,有pk大學最不錯的乙個食堂 the farmer s canteen nm食堂 由於該食堂的菜都很不錯,也公道,所以很多人都喜歡來這邊吃飯。the farmer s canteen的點菜方式如同在超市自選商品一樣,人們從乙個指定的路口進去,再從乙個指定的路口出來並付款。由於來...

codevs線段覆蓋 動態規劃

題目描述 description 給定x軸上的n 0輸入描述 input description 輸入第一行是乙個整數n。接下來有n行,每行有二個空格隔開的整數,表示一條線段的二個端點的座標。輸出描述 output description 輸出第一行是乙個整數表示最多剩下的線段數。樣例輸入 samp...

《動態規劃》 選數統計

時間限制 1 sec 記憶體限制 64 mb 現在從1 m裡可以讓你從小到 出n個數,設這些數為a1到an,要求每個數至少為它前一項的2倍,比如說當m 10,n 4時,下面是幾種可能的選法 1 2 4 8 1 2 4 9 1 2 4 10 1 2 5 10 求一共可以選出多少不同的數列?僅有一行,表...