
Originariamente inviata da
Alhazred
Io almeno un algoritmo che funziona l'ho trovato, anche se ha complessità O(n!) che è uno degli schifi più schifosi che si possa immaginare.

a te

Andiamo sul personale 
Codice PHP:
abstract class IResettableArray
{
protected $array;
public function reset()
{
$this->array = [];
}
}
class IntegrableArray extends IResettableArray
{
public function __construct(array $arr)
{
foreach($arr as $num)
$this->add($num);
}
public function add($e)
{
if(is_numeric($e))
$this->array[] = $e;
else
throw new Exception("Sono permessi solo numeri");
}
public function count()
{
return count($this->array);
}
public function getArray()
{
return $this->array;
}
}
class MaxUniqueSumBuilder extends IResettableArray
{
public function computeSum()
{
$maxs = array_map('max',$this->array);
$sum = [];
foreach($this->array as $k => $arr)
{
$max = max($arr);
unset($maxs[$k]);
while(is_numeric($max) && in_array($max,$maxs))
{
$arr = array_diff($arr,[$max]);
$max = count($arr)>0 ? max($arr) : false;
}
if(is_numeric($max)) $sum[] = $max;
}
return new ComputedSum($sum);
}
public function addMultiArray(array $arr)
{
foreach($arr as $ia)
if($ia instanceof IntegrableArray)
$this->addArray($ia);
}
public function addArray(IntegrableArray $arr)
{
$this->array[] = $arr->count()>0 ? $arr->getArray() : [0];
}
}
class ComputedSum extends IntegrableArray
{
public function __construct(array $max)
{
parent::__construct($max);
}
public function getSum()
{
return array_sum($this->array);
}
}
$array = [new IntegrableArray([30,29]),new IntegrableArray([30,23,21,20])];
$builder = new MaxUniqueSumBuilder();
$builder->addMultiArray($array);
echo $builder->computeSum()->getSum();