在保持索引关联的同时从数组中查找所有可能的总和
Find all possible sums from array while maintaining index association
我正在处理一些提供付款方式的数据,这些付款方式被接受为它们的数值总和。付款方式为:
2 Visa
4 Mastercard
8 American Express
16 Discover
32 Diners
64 Cash
128 Check
256 Debit
因此,如果接受 Visa 和 Mastercard,则值为 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);
我如何解决只有一笔金额可以计算的问题,以及如何确定用于创建该金额的值(付款方式)?
这个应该可以吧,我没时间自己测试,有什么问题欢迎评论(这里$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);
}
我正在处理一些提供付款方式的数据,这些付款方式被接受为它们的数值总和。付款方式为:
2 Visa
4 Mastercard
8 American Express
16 Discover
32 Diners
64 Cash
128 Check
256 Debit
因此,如果接受 Visa 和 Mastercard,则值为 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);
我如何解决只有一笔金额可以计算的问题,以及如何确定用于创建该金额的值(付款方式)?
这个应该可以吧,我没时间自己测试,有什么问题欢迎评论(这里$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);
}