導航:首頁 > 編程語言 > 箱子裝貨物最小容量編程

箱子裝貨物最小容量編程

發布時間:2025-05-16 16:13:42

A. C語言 動態規劃 完全裝箱問題

【問題】 裝箱問題
問題描述:裝箱問題可簡述如下:設有編號為0、1、…、n-1的n種物品,體積分別為v0、v1、…、vn-1。將這n種物品裝到容量都為V的若干箱子里。約定這n種物品的體積均不超過V,即對於0≤i<n,有0<vi≤V。不同的裝箱方案所需要的箱子數目可能不同。裝箱問題要求使裝盡這n種物品的箱子數要少。
若考察將n種物品的集合分劃成n個或小於n個物品的所有子集,最優解就可以找到。但所有可能劃分的總數太大。對適當大的n,找出所有可能的劃分要花費的時間是無法承受的。為此,對裝箱問題採用非常簡單的近似演算法,即貪婪法。該演算法依次將物品放到它第一個能放進去的箱子中,該演算法雖不能保證找到最優解,但還是能找到非常好的解。不失一般性,設n件物品的體積是按從大到小排好序的,即有v0≥v1≥…≥vn-1。如不滿足上述要求,只要先對這n件物品按它們的體積從大到小排序,然後按排序結果對物品重新編號即可。裝箱演算法簡單描述冊搭如下:
{ 輸入箱子的容積;
輸入物品種數n;
按體積從大到小順序,輸入各物品的體積;差喊
預置已用箱子鏈為空;
預置已用箱子計數器box_count為0;
for (i=0;i { 從已用的第一隻箱子開始順序尋找能放入物品i 的箱子j;
if (已用箱子都不能再放物品i)
{ 另用一個箱子,並將物品i放入該箱子;
box_count++;虛姿野
}
else
將物品i放入箱子j;
}
}
上述演算法能求出需要的箱子數box_count,並能求出各箱子所裝物品。下面的例子說明該演算法不一定能找到最優解,設有6種物品,它們的體積分別為:60、45、35、20、20和20單位體積,箱子的容積為100個單位體積。按上述演算法計算,需三隻箱子,各箱子所裝物品分別為:第一隻箱子裝物品1、3;第二隻箱子裝物品2、4、5;第三隻箱子裝物品6。而最優解為兩只箱子,分別裝物品1、4、5和2、3、6。

若每隻箱子所裝物品用鏈表來表示,鏈表首結點指針存於一個結構中,結構記錄尚剩餘的空間量和該箱子所裝物品鏈表的首指針。另將全部箱子的信息也構成鏈表。以下是按以上演算法編寫的程序。
【程序】
# include
# include
typedef struct ele
{ int vno;
struct ele *link;
} ELE;
typedef struct hnode
{ int remainder;
ELE *head;
Struct hnode *next;
} HNODE;

void main()
{ int n, i, box_count, box_volume, *a;
HNODE *box_h, *box_t, *j;
ELE *p, *q;
Printf(「輸入箱子容積\n」);
Scanf(「%d」,&box_volume);
Printf(「輸入物品種數\n」);
Scanf(「%d」,&n);
A=(int *)malloc(sizeof(int)*n);
Printf(「請按體積從大到小順序輸入各物品的體積:」);
For (i=0;i Box_h=box_t=NULL;
Box_count=0;
For (i=0;i { p=(ELE *)malloc(sizeof(ELE));
p->vno=i;
for (j=box_h;j!=NULL;j=j->next)
if (j->remainder>=a[i]) break;
if (j==NULL)
{ j=(HNODE *)malloc(sizeof(HNODE));
j->remainder=box_volume-a[i];
j->head=NULL;
if (box_h==NULL) box_h=box_t=j;
else box_t=boix_t->next=j;
j->next=NULL;
box_count++;
}
else j->remainder-=a[i];
for (q=j->next;q!=NULL&&q->link!=NULL;q=q->link);
if (q==NULL)
{ p->link=j->head;
j->head=p;
}
else
{ p->link=NULL;
q->link=p;
}
}
printf(「共使用了%d只箱子」,box_count);
printf(「各箱子裝物品情況如下:」);
for (j=box_h,i=1;j!=NULL;j=j->next,i++)
{ printf(「第%2d只箱子,還剩餘容積%4d,所裝物品有;\n」,I,j->remainder);
for (p=j->head;p!=NULL;p=p->link)
printf(「%4d」,p->vno+1);
printf(「\n」);
}
}

B. 01背包裝箱問題

本文將探討一個裝箱問題,箱容量V(0≤V≤20000)為正整數,有n個物品(0<n≤30)每個都有特定的體積(同樣為正整數)。目標是通過選擇合適的物品,使得箱子在裝入後剩餘空間最少。具體步驟如下:


首先,輸入箱容量V和物品數量n,然後逐個讀取n個物品的體積,每個體積用一個整數表示。例如,如果箱子容量為24,有6個物品,輸入可能是這樣的:


Input:



接下來,使用一個布爾數組f和一個整數數組a來存儲信息。程序通過一個雙重循環,嘗試填充物品到箱子,同時記錄每個可能的剩餘空間狀態。最後,輸出剩餘空間最小的結果,例如:


Output:


0 - 箱子剩餘空間


在代碼實現中,使用了動態規劃的方法,通過遍歷所有可能的剩餘空間狀態,並利用「0-1背包」的思想,找到使得剩餘空間為最小的組合。這個過程可以用以下偽代碼表示:


for each item (a[i]):
for each possible remaining space (j):
if it's possible to fill the space with item i and previous items:
mark current space as possible
update the minimum remaining space (k)

output the minimum remaining space (v-k)


通過以上描述和偽代碼,我們可以直觀地理解如何解決這個箱子裝箱問題,以求得最小的剩餘空間。


(2)箱子裝貨物最小容量編程擴展閱讀

01背包是在M件物品取出若干件放在空間為W的背包里,每件物品的體積為W1,W2……Wn,與之相對應的價值為P1,P2……Pn。

閱讀全文

與箱子裝貨物最小容量編程相關的資料

熱點內容
c523壓縮比 瀏覽:543
命令語氣的人什麼心態 瀏覽:435
程序員喜歡留指甲嗎 瀏覽:516
七牛雲伺服器收費標准 瀏覽:627
時光相冊加密空間密碼忘記 瀏覽:474
華為雲為用戶提供的服務雲伺服器 瀏覽:634
minecraftlinux伺服器搭建 瀏覽:376
linux命令新建文件 瀏覽:708
長線pdf 瀏覽:607
程序員電腦支持手寫 瀏覽:414
解壓頭戴式耳機推薦 瀏覽:344
紙條app上怎麼樣看對方主頁 瀏覽:883
編譯英語單詞怎麼寫 瀏覽:249
編譯原理和匯編原理的區別 瀏覽:864
如何給加密的pdf解密 瀏覽:770
華為盒子時間同步伺服器地址 瀏覽:95
python處理excel亂碼 瀏覽:391
mysql的命令行 瀏覽:822
jpeg採用什麼演算法 瀏覽:701
程序員紅軸薄膜 瀏覽:306