在保持索引关联的同时从数组中查找所有可能的总和

时间:2015-07-20 18:58:58

标签: php arrays sum combinations

我正在处理一些数据,这些数据提供的付款方式是其数值之和。付款方式是:

2 Visa
4 Mastercard
8 American Express
16 Discover
32 Diners
64 Cash
128 Check
256 Debit

因此,如果接受Visa和万事达卡,则价值为6.如果接受Visa,Mastercard和Discover,则为22。

我认为解决这个问题的一种方法是提出一系列所有可能的总和,其中总和是索引,用于构成该总和的支付方法是该索引的数组。例如:

$methods = array(
    2 => array(
        2 => 'Visa'
    ),
    4 => array(
        4 => 'Mastercard'
    ),
    6 => array(
        2 => 'Visa',
        4 => 'Mastercard'
    ),
    8 => array(
        8 => 'American Express'
    ),
    10 => array(
        2 => 'Visa',
        8 => 'American Express'
    )
);

等等,把它放到一个文件中,然后我要做的就是指定$ methods [10]并获得Visa和Amex的数组。

我的另一部分认为支付方法本身可以放入一个数组中,并且可以使用公式进行动态计算。如果可能的话,我更喜欢这种方式,但我无法理解。一个简单的:

$methods = paymentMethods(10);

如何解决只有工作总额的问题,以及确定使用哪些价值(付款方式)来创造这笔金额?

1 个答案:

答案 0 :(得分:1)

这应该大致有效,我没有时间自己测试,如果有问题,请不要犹豫评论(这里$cards是付款方式的一系列问题的开头)。

<?php

function methods($n) {
    global $cards;
    $k = closest_to($n);
    $r = $n - $k;
    if ($r != 0) {
        return array($k => $cards[$k]) + methods($r);
    } else {
        return array($k => $cards[$k]);
    }
}

function closest_to($n) {
    global $cards;
    $prevK = null;
    foreach ($cards as $k => $v) {
        if ($k > $n) {
            return $prevK;
        }
        $prevK = $k;
    }
    end($cards);
    return key($cards);
}