2

私は商品のショッピングカートを持っており、4、6、または12個のケースに残り物がなく均等に入ることができれば、商品を発送できます. 私はそれを理解していると思っていましたが、カートに8つのアイテムがある場合、コードが失敗し、2 4パックで機能するuutを理解する代わりに、1 6と2が残っていると判断しました。もちろん、私が失敗しなければならないことを引き起こす可能性があるのは8だけではありませんが、その1つの例です。コードでこれを正しく理解するにはどうすればよいですか? 以下は私が今持っているもので、失敗した例として、$qTY変数の金額が8になっています。

$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のカートの場合)または12の場合6の場合と4の場合(22のカートの場合)などです。

4

1 に答える 1

4

アイテムを配送できるかどうかだけを知りたいと仮定すると (パッケージがどのように分割されるかについての情報なしで)、これは完全に不要ではないでしょうか? その場合、それは非常に簡単です:すべての偶数 >=4 が機能するので、次のようになります:

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

EDIT:
パッケージングに関するより詳細な情報が必要な場合は、次のような関数をいくつか作成します(コードパッドでの作業を参照してください):

/*
 *  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;
}
于 2012-04-29T14:09:33.610 に答える