有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且 装载问题要求确定,是否有一个合理的装载方案可将这n
生活随笔
收集整理的這篇文章主要介紹了
有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且 装载问题要求确定,是否有一个合理的装载方案可将这n
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、問題描述
有一批共n個集裝箱要裝上2艘載重量分別為C1和C2的輪船,其中集裝箱i的重量為wi,且 ∑i=1nwi≤c1+c2\sum _{i=1}^{n} wi\leq c1+c2∑i=1n?wi≤c1+c2
裝載問題要求確定,是否有一個合理的裝載方案可將這n個集裝箱裝上這2艘輪船。如果有,找出一種裝載方案。
分析:
(1)首先將第一艘輪船盡最大可能裝滿;
代碼
//最優裝載問題,時間復雜度為O(2^n) #include<iostream> #include<cstring> using namespace std; #define N 10 int n;//n為集裝箱的個數 int c1;//船1的裝載容量 int c2;//船2的裝載容量 int x[N];//存哪些節點存進樹中了1,哪些節點沒有存進去 0 int w[N];//每個集裝箱的重量 int bestx[N]; int cw;//現在已經計算出來的集裝箱的和 int bestcw=0;//最優解 void backtrack(int t,int c){if(t>n){if(cw>bestcw){bestcw=cw;for(int i=1;i<=n;i++){bestx[i]=x[i];}}else return;}else{ if(cw+w[t]<=c){//搜索左子樹 cw+=w[t];x[t]=1;backtrack(t+1,c);cw-=w[t]; //還原x[t]=0;//返回上一層是兩個都還原 }else{x[t]=0;backtrack(t+1,c);//搜索右子樹}} } int main(){memset(x,0,sizeof(x));memset(bestx,0,sizeof(bestx));cout<<"請輸入集裝箱的個數:"<<endl;cin>>n;cout<<"請輸入第一艘船的最大載重量:"<<endl;cin>>c1; cout<<"請輸入第二艘船的最大載重量:"<<endl;cin>>c2;cout<<"請輸入每個集裝箱的重量:"<<endl;for(int i=1;i<=n;i++)cin>>w[i]; cout<<"第一艘船上裝的集裝箱是:"<<endl;backtrack(1,c1);for(int i=1;i<=n;i++)if(bestx[i])cout<<i<<" ";cout<<endl; cout<<"第一艘船的最優載重量是:";cout<<bestcw<<endl;bestcw=0;for(int i=1;i<=n;i++){if(!bestx[i]) bestcw+=w[i];}if(bestcw>c2){cout<<"這艘船不能裝下剩下的所有集裝箱!"<<endl; }else{cout<<"第二艘船上裝的集裝箱是:";for(int i=1;i<=n;i++)if(!bestx[i]) cout<<i<<" ";cout<<endl;cout<<"第二艘船的最優載重量是:";cout<<bestcw<<endl;}return 0; }總結
以上是生活随笔為你收集整理的有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且 装载问题要求确定,是否有一个合理的装载方案可将这n的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重写0-1背包问题的回溯法,使算法能输出
- 下一篇: 对下图所示的连通网络G,用克鲁斯卡尔(K