2012-04-29 13 views
2

我有一個物品的購物車,如果我可以將它們放入4,6或12均勻且沒有剩餘的情況下,我可以發貨。然而,我認爲我知道如果我的購物車有8個物品,我的代碼失敗了,因此它會計算出1個剩下的2個,而不是計算它可以在2個4包中工作。 8當然不是唯一可能導致我必須失敗的數字,但它只是一個例子。我怎樣才能讓我的代碼正確地解決這個問題?下面是我現在所擁有的,而即時通訊仍然以8位的$ qTY var作爲失敗的例子。根據總數確定案例數量(4,6,12)

$num12s = $tQTY/12; 

$num12s = explode(".", $num12s); 
$numCases = $num12s[0]; 

if($num12s[0] >= 1){ 

$doSub = $num12s[0] * 12; 
$tQTY = $tQTY - $doSub; 

} 

$num6s = $tQTY/6; 
$num6s = explode(".", $num6s); 
$numCases = $numCases + $num6s[0]; 

if($num6s[0] >= 1){ 

$doSub = $num6s[0] * 6; 
$tQTY = $tQTY - $doSub; 

} 


$num4s = $tQTY/4; 
$num4s = explode(".", $num4s); 
$numCases = $numCases + $num4s[0]; 

if($num4s[0] >= 1){ 

$doSub = $num4s[0] * 4; 
$tQTY = $tQTY - $doSub; 

} 

我需要填寫12首先的情況下,如果我不能做到這一點,我需要填補6下的情況下,如果我不能做到這一點,我需要填補4的情況,但如果我不能做按順序比2例4(對於8號手推車)或1例12例6例和4例(對於22號手推車)等。

+2

有沒有聽說過模運算符? http://php.net/manual/en/language.operators.arithmetic.php – tvanfosson 2012-04-29 13:57:15

+1

請參閱http://en.wikipedia.org/wiki/Bin_packing_problem。 – cmbuckley 2012-04-29 14:47:28

回答

4

這不是完全沒有必要的,假設你只想知道是否有可能交付物品(沒有關於包裝將如何分割的信息)?在這種情況下,它很容易:埃維甚至數> = 4會的工作,所以它只是:

$possible = ($number>=4 && $number%2==0); 

編輯:
如果您還需要了解包裝更詳細的信息,我會創造一些像這樣的功能(see it working on codepad):

/* 
* determines if the given number of items is deliverable or not. 
*/ 
function delivery_possible($number_of_items){ 
    return ($number_of_items>=4 && $number_of_items%2==0); 
} 

/* 
* returns an array containing a counter for each package-size given 
* the number of items. returns false if it can't be solved without 
* leaving a rest. 
*/ 
function delivery_packages($number_of_items){ 
    if(!delivery_possible($number_of_items)){ 
    return false; //impossibru!!! 
    } 
    $r = array('size4'=>0, 'size6'=>0, 'size12'=>0); 

    $r['size12'] = $number_of_items%12==0?(int)($number_of_items/12):(int)(($number_of_items-4)/12); 
    $number_of_items -= $r['size12']*12; 

    $r['size6'] = $number_of_items%6==0?(int)($number_of_items/6):(int)(($number_of_items-4)/6); 
    $number_of_items -= $r['size6']*6; 

    $r['size4'] = (int)($number_of_items/4); 

    return $r; 
} 
+1

downvote的解釋會很好。我願意提高我的答案,但我應該如何知道什麼是壞的,如果沒有人告訴我... – oezi 2012-04-29 14:26:56

+0

我修改了我的問題,但我有問題是我需要能夠填寫12的第一個,如果我可以如果我可以的話,6的下一個,如果我能的話,4的最後一個。 – user875293 2012-04-29 14:29:47

+0

我正在努力,我會在幾分鐘內編輯我的答案。那裏是 – oezi 2012-04-29 14:35:14