簡體   English   中英

PHP:找零錢的難題

[英]PHP: coin change puzzle

我正在研究Advent of Code,作為練習TDD和學習PHPSpec的一種方式。 我被困在第17天,這本質上是找零硬幣的難題。

精靈們又買了太多蛋酒-這次是150升。 要將其全部裝入冰箱,您需要將其移入較小的容器中。 您盤點了可用容器的容量。

例如,假設您有20、15、10、5和5升的容器。 如果您需要存儲25升,可以通過以下四種方法進行:

  • 15和10
  • 20和5(前5個)
  • 20和5(第二個5)
  • 15、5和5

完全填充所有容器,有多少種不同的容器組合可以完全適合所有150升蛋酒?

這是我的代碼。 我使用上面的示例編寫了一個測試。 每個示例combinations方法應返回4 ,但返回3。似乎無法處理一個容器超過5升的事實。

有什么建議嗎?

<?php

namespace Day17;

class Calculator
{
    private $containers = [];

    public function combinations($total, array $containers)
    {
        $combinations = $this->iterate($total, $containers);
        return count($combinations);
    }

    /**
     * http://stackoverflow.com/questions/12837431/find-combinations-sum-of-elements-in-array-whose-sum-equal-to-a-given-number
     *
     * @param $array
     * @param array $combinations
     * @param array $temp
     * @return array
     */
    private function iterate($sum, $array, $combinations = [], $temp = [])
    {
        if (count($temp) && !in_array($temp, $combinations)) {
            $combinations[] = $temp;
        }

        $count = count($array);
        for ($i = 0; $i < $count; $i++) {

            $copy = $array;
            $elem = array_splice($copy, $i, 1);

            if (count($copy) > 0) {

                $add = array_merge($temp, array($elem[0]));
                sort($add);
                $combinations = $this->iterate($sum, $copy, $combinations, $add);

            } else {

                $add = array_merge($temp, array($elem[0]));
                sort($add);
                if (array_sum($combinations) == $sum) {
                    $combinations[] = $add;
                }
            }
        }

        return array_filter($combinations, function ($combination) use ($sum) {
            return array_sum($combination) == $sum;
        });
    }
}

將可用容器的數組索引用作組合值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM