金明的預算方案 NDK1503 解題報告

2021-05-26 10:23:12 字數 1735 閱讀 1367

program ndk1503;

type atp=record

v,p,num:longint;

end;

var n,m:longint;

a:array [1..60] of atp;

f:array [0..32000] of longint;

t1,t2:array [1..60] of atp;

procedure init;

var i,tex:longint;

begin

readln(n,m);

for i:=1 to m do

begin

readln(a[i].v,a[i].p,tex);

a[i].num:=tex;

if tex<>0 then

begin

if t1[tex].v=0 then

begin

t1[tex].v:=a[i].v;

t1[tex].p:=a[i].p;

endelse

begin

t2[tex].v:=a[i].v;

t2[tex].p:=a[i].p;

end;

end;

end;

end;

function max(x,y:longint):longint;

begin

if x>y then exit(x) else exit(y);

end;

procedure main;

var i,j,maxx:longint;

begin

for i:=1 to m do

begin

if a[i].num=0 then

begin

for j:=n downto 0 do

begin

if j-a[i].v>=0 then f[j]:=max(f[j],f[j-a[i].v]+a[i].v*a[i].p);//只選主件

if (t1[i].v<>0) and (j-a[i].v-t1[i].v>=0) then f[j]:=max(f[j],f[j-a[i].v-t1[i].v]+a[i].v*a[i].p+t1[i].v*t1[i].p);//選主件+附件1

if (t2[i].v<>0) then

begin

if j-a[i].v-t2[i].v>=0 then f[j]:=max(f[j],f[j-a[i].v-t2[i].v]+a[i].v*a[i].p+t2[i].v*t2[i].p);//選主件+附件2

if j-a[i].v-t1[i].v-t2[i].v>=0 then f[j]:=max(f[j],f[j-a[i].v-t1[i].v-t2[i].v]+a[i].v*a[i].p+t1[i].v*t1[i].p+t2[i].v*t2[i].p);//選主件+附件1+附件2

end;

end;

end;

end;

end;

begin

assign(input,'ndk1503.in'); reset(input);

assign(output,'ndk1503.out'); rewrite(output);

init;

main;

writeln(f[n]);

close(input); close(output);

end.

金明的預算方案

problem description 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只有不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件和附件,附件是從屬...

金明的預算方案

題目描述 金明今天很開心,媽媽昨天對他說 你的房間需要購買哪些物品,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子 主件 附件 電腦 印表機,掃瞄器 書櫃 圖書 書桌 檯燈,文具 工作椅 無 如果...

金明的預算方案

題目 分析一下,若想選附件,必然要選其主件,看上去是個依賴揹包問題,也就是樹形dp,但是這個題目限制了乙個問題,也就是乙個主件至多有2個附件,那麼也就只有4種方案,只選主件,選主件和附件1,選主件和附件2,選主件和附件1和附件2。只有4種方案,所以將其轉化成為乙個組合揹包問題。include inc...