貪心算法之最優裝船問題

       越來越發現自己的編程功底很差,於是近期打算惡補下。看到一題目,初見覺得很簡單,但是實際編程的時候,可能是由於自己的基本功太弱的原因吧,還是花費了很長的時間的。題目如下:       

          有一批集裝箱要裝入一個載質量爲C的貨船種,每個集裝箱的質量由用戶自己輸入指定,在貨船的裝載體積不限的前提下,如何裝載集裝箱才能儘可能多地的將集裝箱裝入貨船中。

 

 

         看到該題,第一想到的就是貪心算法。關鍵在於將問題抽象出來,其實每個箱子是有兩個特性的。箱子的質量以及箱子的編號(隱藏的)。抽象出這兩點就好辦多了。實現將箱子按質量排序,在排序的過程中有點很重要,那就是在按質量移動箱子的時候,要讓箱子的編號跟着一起移動。

    

         完整代碼如下:

#include "stdio.h"

px(int h_1[],int h1_1[],int n_1,int n_2)
{
 int i_1,j_1;
 int temp=0;
 int temp_1=0;

 ///////對數組h1_1[]初始化/////
 for (i_1=0;i_1<8;i_1++)
 {
  h1_1[i_1]=i_1;
 }

 //////冒泡排序///////////////
 for (i_1=0;i_1<8;i_1++)
 {
  for (j_1=0;j_1<8;j_1++)
  {
   if (h_1[j_1]>h_1[j_1+1])
   {
    ///////相鄰的數互換//////
    temp=h_1[j_1+1];
    h_1[j_1+1]=h_1[j_1];
    h_1[j_1]=temp;

    /////將箱子號也移動/////
    temp_1=h1_1[j_1];
    h1_1[j_1]=h1_1[j_1+1];
    h1_1[j_1+1]=temp_1;
   }
  }
 }

 for (i_1=0;(i_1<8)&&(h_1[i_1]<=n_2);i_1++)
 {
  n_2=n_2-h_1[i_1];//船剩餘的載重量
  printf("%d ",h1_1[i_1]);//輸出最優裝船的箱子號
 }
}

int main()
{
 int c;
 int i;
 int h[8]={0};
 int h1[8]={0};
 int n; //貨物的種數
 printf("請輸入船的最大裝載\n");
 scanf("%d",&c);
 printf("請輸入8種貨物的質量:\n");
 for (i=0;i<8;i++)
 {
  scanf("%d",&h[i]);
 }

 px(h,h1,8,c);//對貨物的質量排序,並且用數組h1保存貨物的箱子號(下表)
}

 

 

我發現我的變量命名,不是一般的稀癟。

發佈了19 篇原創文章 · 獲贊 14 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章