日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且 装载问题要求确定,是否有一个合理的装载方案可将这n

發(fā)布時間:2024/2/28 编程问答 45 豆豆

一、問題描述

有一批共n個集裝箱要裝上2艘載重量分別為C1和C2的輪船,其中集裝箱i的重量為wi,且 ∑i=1nwi≤c1+c2\sum _{i=1}^{n} wi\leq c1+c2i=1n?wic1+c2

裝載問題要求確定,是否有一個合理的裝載方案可將這n個集裝箱裝上這2艘輪船。如果有,找出一種裝載方案。

分析:

(1)首先將第一艘輪船盡最大可能裝滿;

(2)然后將剩余的集裝箱裝上第二艘輪船。

代碼

//最優(yōu)裝載問題,時間復(fù)雜度為O(2^n) #include<iostream> #include<cstring> using namespace std; #define N 10 int n;//n為集裝箱的個數(shù) int c1;//船1的裝載容量 int c2;//船2的裝載容量 int x[N];//存哪些節(jié)點存進樹中了1,哪些節(jié)點沒有存進去 0 int w[N];//每個集裝箱的重量 int bestx[N]; int cw;//現(xiàn)在已經(jīng)計算出來的集裝箱的和 int bestcw=0;//最優(yōu)解 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<<"請輸入集裝箱的個數(shù):"<<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<<"第一艘船的最優(yōu)載重量是:";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<<"第二艘船的最優(yōu)載重量是:";cout<<bestcw<<endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为wi,且 装载问题要求确定,是否有一个合理的装载方案可将这n的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。