ssl1640 疊放箱子問題

2021-07-28 22:08:54 字數 1514 閱讀 9819

疊放箱子問題

time limit:10000ms  memory limit:65536k

total submit:317 accepted:119 

case time limit:1000ms

description

某港口有一批貨櫃,將其編號,分別為1至n。每乙個箱子的外型尺寸都是一樣的,現在要將其中某些貨櫃疊放起來,貨櫃疊放的規則如下: 

1)每個貨櫃上最多只能直接疊放乙個貨櫃。 

2)編號較小的貨櫃不能放在編號較大的貨櫃之上。 

3)每個貨櫃都給出了自身的重量和可承受的重量,每個貨櫃之上的所有貨櫃重量之和不得超過該貨櫃的可承受的重量。 

現在要求你程式設計,從中選出最多個貨櫃,使之在滿足以上條件的情況下疊放起來,即要求疊得盡可能地高。 

input

第一行是乙個正整數n,表示共有n個貨櫃(1≤ n ≤1000)。 

以下共有n行,每行兩個正整數,中間用空格分隔,分別表示每個貨櫃的自身重量和可承受的重量,兩個數均為小於等於3000。

output

輸出最多可疊放的貨櫃總數。執行時間不超過去時10秒。

sample input

5  

19 15

7 13

5 7

6 8

1 2

sample output

source

cwj

var

f:array[1..1000,0..6000]of longint; //f(i,j)表示前i個箱子中最多可選出f(i,j)個疊放,還可承受重量j

a,b:array[1..1000]of longint;//a是自身的重量,b是可承受的重量

n,i,j,ans:longint;

function max(a,b:longint):longint;//狀態轉移方程

begin

if a>b then exit(a);

exit(b);

end;

begin

readln(n);

for i:=1 to n do readln(a[i],b[i]);

f[n,a[n]]:=1;//至少可以放乙個

for i:=n-1 downto 1 do

begin

f[i]:=f[i+1];//先繼承

for j:=0 to b[i] do

f[i,j+a[i]]:=max(f[i+1,j]+1,f[i,j+a[i]]);//放或是不放

end;

for i:=0 to 6000 do

ans:=max(f[1,i],ans);

writeln(ans);

end.

疊放箱子問題

疊放箱子問題 description 某港口有一批貨櫃,將其編號,分別為1至n。每乙個箱子的外型尺寸都是一樣的,現在要將其中某些貨櫃疊放起來,貨櫃疊放的規則如下 1 每個貨櫃上最多只能直接疊放乙個貨櫃。2 編號較小的貨櫃不能放在編號較大的貨櫃之上。3 每個貨櫃都給出了自身的重量和可承受的重量,每個貨...

疊放箱子問題

疊放箱子問題 time limit 10000ms memory limit 65536k total submit 309 accepted 115 case time limit 1000ms description 某港口有一批貨櫃,將其編號,分別為1至n。每乙個箱子的外型尺寸都是一樣的,現在...

疊放箱子問題

題意 某港口有一批貨櫃,將其編號,分別為1至n。每乙個箱子的外型尺寸都是一樣的,現在要將其中某些貨櫃疊放起來,貨櫃疊放的規則如下 1 每個貨櫃上最多只能直接疊放乙個貨櫃。2 編號較小的貨櫃不能放在編號較大的貨櫃之上。3 每個貨櫃都給出了自身的重量和可承受的重量,每個貨櫃之上的所有貨櫃重量之和不得超過...