def silnia(n)
if n == 0
1
else
n * silnia(n-1)
end
end
puts (silnia(3) / (silnia(2) * silnia(1))) + (silnia(6) / (silnia(2) * silnia(4))) + (silnia(12) / (silnia(2) * silnia(10))) + (silnia(42) / (silnia(2) * silnia(40))) + (silnia(102) / (silnia(2) * silnia(100))) + (silnia(202) / (silnia(2) * silnia(200)))[/code]
To może coś takiego. Bardziej prawdopodobny wynik. Tylko nie wiem czy czasami tam jeszcze nie trzeba czegoś odjąć :? Bo to na moje oko będą jakieś kombinacje z powtórzeniami.
To moja propozycja - weryfikowałem dla identycznego problemu z TOTAL=10. Być może nie jest to poprawne rozwiązanie, ale z pewnością “niezbyt dalekie od poprawnego”
def print_comb(combination,value)
print combination.join(" “)
puts " 1” * value
end
def combination(value, index_max, combination)
result = 0
COINS[0…index_max].each_with_index do |coin,index|
if value - coin >= 0
print_comb(combination + [coin], value - coin)
result += 1 + combination(value - coin,index,combination + [coin])
end
end
result
end
puts “wynik #{combination(TOTAL, COINS.size-1, []) +1}”[/code]
Dodam, że program kończy działanie po kilku sekundach
Można by go przyspieszyć, przez przechowywanie częściowych wyników, ale nie ma takiej potrzeby.