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...