DP 揹包 疊放箱子問題(原始解法)

2021-09-02 19:59:28 字數 1139 閱讀 7089

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

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

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

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

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

input

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

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

output

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

看到這題的時候就想著是dp揹包,然後果然。。。

箱子從上往下放,這樣可以保證序號從大到小,且好計算有沒有超重。

迴圈i從n到1,表示第i個箱子。

迴圈j從1到6000,表示重量。

a[i][j]表示前i個箱子,總重量為j的最大箱子數。

…當迴圈到箱子i,可放重量j時

有倆種操作

1.不放,a[i][j]=a[i+1][j];

2.放,a[i][j]=a[i+1][j-w[i]]+1;

放的話要確保j-w[i]>0(就是保證加上本身沒有超過儲存的限制)

和此箱子可承受的重量c[i]要大於j-w[i];

#include

int n,z[

1002

],c[

1002

],a[

1002][

6002]=

;int

max(

int a,

int b)

intmain()

int ans=0;

for(

int i=

1;i<=

6000

;++i)

if(a[1]

[i]>ans) ans=a[1]

[i];

printf

("%d"

,ans)

;}

疊放箱子問題 DP

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

DP 疊放箱子

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

疊放箱子問題

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