一、最優裝載問題填表
最優裝載問題描述:有一批共有n個集裝箱要裝上一艘載重量為C的輪船,其中第i個集裝箱的重量為wi。問怎樣裝載能保證上船的集裝箱總重量最大?
最優裝載問題可以用0/1背包問題進行之間的轉換,將背包容量C變為各個集裝箱的載重量以及每個集裝箱的費用都被置為1。
那麼最優裝載問題的動態規劃填表過程如下:
for (int i=0;i<=n;i++) for (int j=0;j=w[i-1] && dp[i-1][j-w[i-1]]+1>dp[i][j]) dp[i][j]=dp[i-1][j-w[i-1]]+1; }
其中dp[i][j]表示前i個集裝箱在載重量為j的限制下所能裝載的最多箱數。
二、最優裝載問題的貪心算法實現
最優裝載問題也可以使用貪心算法進行解決,其具體步驟如下:
1、計算出每個集裝箱的裝載價值,即每個集裝箱所能裝載的貨物重量。
2、將集裝箱按照裝載價值從大到小排序。
3、依次將集裝箱裝載到船上,直到船的載重量達到上限。
int GreedyLoading(int *w, int *v, int n, int C){ int cnt=0,ans=0; vector<pair> load; for (int i=0;i=0;i--){ if (cnt+load[i].second<=C) ans+=load[i].second*load[i].first,cnt+=load[i].second; else ans+=(C-cnt)*load[i].first,cnt=C; } return ans; }
三、最優裝載問題回溯法
最優裝載問題也可以使用回溯法進行解決:
1、將集裝箱按照重量從大到小排序。
2、按照深度優先的方式,依次向船中裝載集裝箱。
3、在每個狀態下,判斷是否可以載入集裝箱,如果可以,則繼續向下搜索。反之,則回退到上一個狀態。
void BacktrackLoading(int *w, int n, int C, int& ans, int& current_sum, int i){ if (i>=n){ if (current_sum>ans) ans=current_sum; return; } if (current_sum+w[i]<=C) BacktrackLoading(w,n,C,ans,current_sum+w[i],i+1); BacktrackLoading(w,n,C,ans,current_sum,i+1); }
四、最優裝載問題偽代碼
最優裝載問題的偽代碼:
for (int i=0;i<=n;i++) for (int j=0;j=w[i-1] && dp[i-1][j-w[i-1]]+1>dp[i][j]) dp[i][j]=dp[i-1][j-w[i-1]]+1; }
五、最優裝載問題c語言代碼
最優裝載問題的c語言代碼:
int DPloading(int *w, int n, int C){ int dp[C+1],ans=0; memset(dp,0,sizeof(dp)); for (int i=0;i=w[i];j--) if (dp[j]<dp[j-w[i]]+1) dp[j]=dp[j-w[i]]+1; //這裡dp[j-w[i]]+w[i]也是可以的 for (int i=0;ians) ans=dp[i]; return ans; }
六、最優裝載問題的算法
最優裝載問題的算法包括貪心算法和動態規划算法。
七、最優裝載問題貪心算法代碼
最優裝載問題貪心算法的c語言代碼:
int GreedyLoading(int *w, int *v, int n, int C){ int cnt=0,ans=0; // cnt表示總共裝載的重量 vector<pair> load; for (int i=0;i=0;i--){ if (cnt+load[i].second<=C) ans+=load[i].second*load[i].first,cnt+=load[i].second; else ans+=(C-cnt)*load[i].first,cnt=C; } return ans; }
八、最優裝載問題實驗報告
我們進行了一系列的實驗來對比不同算法在求解最優裝載問題時的運行時間和結果,實驗結果如下:
1、數據規模為10,100,1000,10000,100000,1000000個集裝箱,每個集裝箱的重量為1~10之間的隨機數。
2、實驗數據如下:
n 貪心算法 動態規划算法 回溯法 10 0.001ms 0.001ms 0.003ms 100 0.003ms 0.005ms 1.154ms 1000 0.005ms 0.012ms 607.127ms
可以看到,在小數據規模下,三種算法的運行時間都很快,隨機數的影響不會太大,而在大數據規模下,貪心算法和動態規划算法的運行時間相對穩定,而回溯法的運行時間隨着數據的增加而大大增加。
九、最優裝載問題時間複雜度
最優裝載問題的時間複雜度:
1、貪心算法的時間複雜度為O(nlogn),因為需要對集裝箱按照裝載價值排序。
2、動態規劃的時間複雜度為O(nC),其中C為船的載重量。
3、回溯法的時間複雜度最差為O(2^n)。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/198114.html