描述:有一批集裝箱要裝上一艘載重量爲C的輪船。其中集裝箱i的重量爲wi。最優裝載問題要求肯定在裝載體積不受限制的狀況下,將盡量多的集裝箱裝上輪船。ios
貪心算法之最優裝載算法
給出n個物體,第i個物體的重量爲wi。 選擇儘可能多的物體,使得總重量不超過C。
注意:這個地方每一個物體是不可再分割的總體。 思路: 先把全部物體按重量排序(從小到大排序) , 而後貪心選擇重量比較小的物體直到所選物體的總重量超過所容許的最大重量C 。
通常選擇是從最小的開始,因此先要排序
第一種方法(容器)測試
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int c; //輪船的載重量 cout<<"輪船的載重量: "; cin>>c; int n; //集裝箱個數 cout<<"集裝箱個數: "; cin>>n; vector <int> v(n);//定義一個容器v(n),其類型爲int· cout<<"物品質量:"; for(int i=0;i<n;i++) cin>>v[i]; sort(v.begin(),v.end());//從小到大排序 int all=0; //最多能裝的集裝箱個數 int cp=c; //當前剩餘載重量 for(int i=0;i<n;i++) { if(cp<=c&&v[i]<=cp) { all++; cp-=v[i]; } if(cp<v[i]) break; } cout<<"最多可裝入的個數:"<<all<<endl; cout<<"最終承載量:"<<c-cp<<endl; return 0; }
第二種方法spa
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 6 int main() 7 { 8 int i,j,c,n;//分別爲測試個數、集裝箱個數 9 float weight[1000];//集裝箱重量 10 float load;//輪船載重量 11 cin>>c; 12 for(i=0;i<c;i++) 13 { 14 cin>>n>>load; 15 for(j=0;j<n;j++) 16 cin>>weight[j]; 17 sort(weight,n+weight); 18 //開始裝載 19 int count=0; 20 float sum=0.0; 21 for(int k=0;k<n;k++) 22 { 23 if(load>=weight[k]) 24 { 25 sum=sum+weight[k]; 26 load=load-weight[k]; 27 count++; 28 } 29 else 30 break; 31 32 } 33 cout<<count<<" "<<sum<<endl; 34 } 35 36 39 return 0; 40 41 42 }