1. 程式人生 > >貪心演算法之 6*6,5*5,4*4,3*3,2*2,1*1分包裹問題

貪心演算法之 6*6,5*5,4*4,3*3,2*2,1*1分包裹問題

題目描述

一個工廠製造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有六個型號,他們的長寬分別為11, 22, 33, 44, 55, 66。這些產品通常使用一個 66h 的長方體包裹包裝然後郵寄給客戶。因為郵費很貴,所以工廠要想方設法的減小每個訂單運送時的包裹數量。他們很需要有一個好的程式幫他們解決這個問題從而節省費用。現在這個程式由你來設計。

輸入

輸入檔案包括幾行,每一行代表一個訂單。每個訂單裡的一行包括六個整數,中間用空格隔開,分別為11至66這六種產品的數量。輸入檔案將以6個0組成的一行結尾。

輸出

除了輸入的最後一行6個0以外,輸入檔案裡每一行對應著輸出檔案的一行,每一行輸出一個整數代表對應的訂單所需的最小包裹數。

樣例輸入

0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0

樣例輸出

2
1

#include<stdio.h>
int main()
{

    int a[7],sum,num,i;
    int three[4]={0,5,3,1};
    while(1)
    {
        sum=0;num=0;
        for(i=1;i<7;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        if(sum==0) break
; num = a[6]+a[5]+a[4]+(a[3]+3)/4; //算得6*6,5*5,4*4,3*3起碼的大箱子數 int two_rest = a[4]*5+three[a[3]%4]; //算得還可以填的2*2空位數,要用已有的2*2來填 if(a[2]>two_rest) num += (a[2]-two_rest+8)/9; //如果2*2過多,算得用已有的2*2填補後 剩餘的2*2 還需要的箱子數 int one_rest = 36*(num-a[6])-a[5]*25-a[4]*16-a[3]*9-a[2]*
4; //算得還可以填的1*1空位數,要用已有的1*1來填 if(a[1]>one_rest) num += (a[1]-one_rest+35)/36; //如果1*1過多,算得用已有的1*1填補後,剩餘的1*1還需要的箱子數 printf("%d\n",num); } return 0; }