<?php
$dados = array('0.10','0.20','0.30','0.50',
               '3.00','3.30','4.00','5.00',
               '1.00','1.10','2.00','2.20');

function adicionaValorCombinacao($dados, $comb, $objetivo, &$resultados){
	if (count($comb) == count($dados)){
		return;		
	}
		
	foreach ($dados as $dado){
		if (!in_array($dado, $comb)){
			array_push($comb, $dado);
			$total = array_sum($comb);
			if ($total > $objetivo){
				array_pop($comb);
				break;			
			}
			
			$chave = str_split(implode("", $comb));
			sort($chave);
			$chave = implode("", $chave);
			if ($total === $objetivo && !array_key_exists($chave, $comb)){
				$resultados[$chave] = $comb;
			}
			
			adicionaValorCombinacao($dados, $comb, $objetivo, $resultados);
			array_pop($comb);			
		}
	}
}

function combinacoesParaObjetivo($dados, $objetivo){
	$resultados = Array();
	for ($i = 0; $i < count($dados); ++$i){
		$combinacao = Array();
		adicionaValorCombinacao($dados, $combinacao, $objetivo, $resultados);
		$ultimo = array_pop($dados);
		array_unshift($dados, $ultimo);
	}
	
	return $resultados;
}

$dados = array_map(function($val){ return floatval($val); }, $dados);
$combinacoes = combinacoesParaObjetivo($dados, 1.1);
var_dump($combinacoes);