動態規劃 疊放箱子

2021-08-09 11:23:21 字數 1286 閱讀 2043

動態規劃:疊放箱子

問題描述:

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

1:每個箱子上最多只能直接疊放乙個箱子;

2:編號較小的箱子不能直接放在編號較大的箱子之上;

3:每個箱子都給出了自身重量與可承受重量,每個箱子之上的所有箱子重量之和不得超過該箱的可承受重量.

要求:程式設計選擇最多的滿足條件的箱子。

分析:

當我看到條件的時候,自動與0-1揹包問題對應:最多只能放乙個就是選擇放與不放的問題。

我們定義目標函式f[i][j]表示第i個箱子到第n個箱子中總重量為j的最大箱子數.

方程:

f[i[j]=max(f[i+1][j],f[i+1][j-weight[i]]+1);

能選的條件是:j>=weight[i]&&capacity[i]>=j-weight[i];

#include

#include

#include

#include

using

namespace

std;

const

int maxn=400;

int weight[maxn];

int dp[maxn][maxn];

int capacity[maxn];

bool mark[maxn];

int p[maxn];

int n,number;

bool visit[maxn];

void dfs(int cnt,int ans,int flag)

return ;

}for(int i=flag;i<=n;i++)}}

int main()

for(i=1;i<=n;i++)

int sum=0;

memset(dp,0,sizeof(dp));

memset(mark,false,sizeof(mark));

memset(visit,false,sizeof(visit));

for(i=n;i>=1;i--)}}

number=0;

for(i=1;i<=sum;i++)

number=max(dp[1][i],number);

for(i=1;i<=sum;i++)

if(dp[1][i]==number)

dfs(0,i,1);

return

0;}

疊放箱子問題

疊放箱子問題 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 每個貨櫃都給出了自身的重量和可承受的重量,每個貨櫃之上的所有貨櫃重量之和不得超過...