Збережена копійка - це копійка


21

... порахував!

Ви передасте програмі змінну, яка представляє кількість грошей у доларах та / або центах та масив значень монет. Ваша задача полягає в тому, щоб вивести кількість можливих комбінацій заданого масиву значень монет, які б склали суму, передану коду. Якщо неможливо з названими монетами, програма повинна повернутися 0.

Примітка американської нумізматичної термінології:

  • Монета за 1 цент: копійка
  • Монета 5 цент: нікель
  • 10-центна монета: дим
  • Монета за 25 центів: квартал (четвертий долар)

Приклад 1:

Програма прийнята:

12, [1, 5, 10]

(12 центів)

Вихід:

4

Існує 4 можливих способи комбінування монет, названих для отримання 12 центів:

  1. 12 копійок
  2. 1 нікель і 7 копійок
  3. 2 нікелі та 2 копійки
  4. 1 копійка і 2 копійки

Приклад 2:

Програма прийнята:

26, [1, 5, 10, 25]

(26 центів)

Вихід:

13

Існує 13 можливих способів поєднання названих монет для отримання 26 центів:

  1. 26 копійок
  2. 21 копійка і 1 нікель
  3. 16 копійок і 2 нікелі
  4. 11 копійок і 3 нікелі
  5. 6 копійок і 4 нікелі
  6. 1 копійка і 5 нікелів
  7. 16 копійок і 1 дим
  8. 6 копійок і 2 дими
  9. 11 копійок, 1 копійка і 1 нікель
  10. 6 копійок, 1 дим і 2 нікелі
  11. 1 копійка, 1 дим і 3 нікелі
  12. 1 копійка, 2 димери і 1 нікель
  13. 1 чверть і 1 копійка

Приклад 3:

Програма прийнята:

19, [2, 7, 12]

Вихід:

2

Є два можливих способи комбінування монет, названих для отримання 19 центів:

  1. 1 монета 12 центнів і 1 монета 7 центів
  2. 1 монета 7 центів та 6 монети 2 центи

Приклад 4:

Програма прийнята:

13, [2, 8, 25]

Вихід:

0

Немає можливих способів поєднання монет, названих для отримання 13 центів.


Це було через пісочницю. Застосовуються стандартні лазівки. Це кодовий гольф, тому відповідь з найменшими байтами виграє.


1
с / порахував / заробив
mbomb007

4
@ Mbomb007 Для чотирьох байт: s/count/earn.
wizzwizz4

5
Для мене, і я думаю, для інших людей, які не платять доларами, не очевидно, що таке нікель і ціна. Зрозуміти це було не важко, але, можливо, ви могли б написати це трохи більше міжнародного характеру?
Kritzefitz

2
@Kritzefitz. Я додав це до питання.
TRiG

2
@jpaugh: Хоча монети-о-філи можуть погодитися, я повинен був би не погодитися. Копійка - це стандартна монета, яка має вартість одного цента. П'ятдесят чотири копійки - це сума грошей. П'ятдесят чотири копійки - це явно п'ятдесят чотири монети. Його також називають «монета в один цент», або (офіційно) «одноцентрова частина». Я не можу придумати жодної формальної установки, де слово "копійка" було б неприйнятним. Ці люди , які спеціально займаються збором монет, не мають жодної проблеми називати це "копійкою".
MichaelS

Відповіді:


12

Желе ( виделка ), 2 байти

æf

Це спирається на гілку Jelly, де я працював над впровадженням розв’язання атомів Frobenius, тому, на жаль, ви не можете спробувати його в Інтернеті.

Використання

$ ./jelly eun 'æf' '12' '[1,5,10]'
4
$ ./jelly eun 'æf' '26' '[1,5,10,25]'
13
$ ./jelly eun 'æf' '19' '[2,7,12]'
2
$ ./jelly eun 'æf' '13' '[2,8,25]'
0

Пояснення

æf  Input: total T, denominations D
æf  Frobenius count, determines the number of solutions
    of nonnegative X such that X dot-product D = T

10
... це навіть не чесно.
ETHproductions

... і я думаю, що це набагато швидше!
Джонатан Аллан

18

Haskell, 37 34 байт

s#l@(c:d)|s>=c=(s-c)#l+s#d
s#_=0^s

Приклад використання: 26 # [1,5,10,25]-> 13.

Простий рекурсивний підхід: спробуйте як наступне число у списку (поки воно менше або дорівнює кількості) та пропустіть його. Якщо віднімання числа призводить до нуля, візьміть 1інакше (або якщо в списку не вистачає елементів), візьміть a 0. Підсумовуйте ті 1і 0з.

Редагувати: @Damien: збережено 3 байти, вказавши на коротший базовий регістр для рекурсії (який також можна знайти у відповіді @xnors ).


s # l @ (c: d) | s> = c = (sc) # l + s # d; s # _ = 0 ^ s
Дамієн

і що буде в результаті 1209 [1,5,10,33,48] та 6000 [1,5,10,33], щоб я міг відкалібрувати свій код
RosLuP

@RosLuP: 1209 # [1,5,10,33,48]-> 1314050.
німі

@nimi ok для 1314050 У мене такий же результат тут ... Спасибі ...
RosLuP

@RosLuP: ... 537 хвилин пізніше: 6000 # [1,5,10,33]-> 22086484.
німі

15

Математика, 35 22 байти

Завдяки милям за пропозицію FrobeniusSolveта збереження 13 байт.

Length@*FrobeniusSolve

Оцінюється за неназваною функцією, яка приймає список монет як перший аргумент, а цільове значення - як другий. FrobeniusSolveє скороченням для розв’язання рівнянь Діофантіна форми

a1x1 + a2x2 + ... + anxn = b

для невід’ємних цілих чисел і дає нам усі рішення.xi


@RosLuP Для цього вам потрібно мати доступ до Mathematica. Крім того, це анонімна функція, щоб викликати її, або інкапсулювати її в дужки, або зберегти в змінну. Наприклад,(Length@*FrobeniusSolve)[{1, 7, 9}, 18]
миль

і що буде в результаті 1209 [1,5,10,33,48] і 6000 [1,5,10,33], щоб я міг відкалібрувати свій код
RosLuP

@RosLuP 1314050 і 22086484 відповідно.
Мартін Ендер

Добре, результат такий же, дякую ...
RosLuP

16 голосів за це виправдані лише в тому випадку, якщо програміст, який написав Length @ *
FrobeniusSolve

12

Pyth, 8 байт

/sM{yS*E

Сила груба сила, занадто інтенсивна пам'ять для фактичного тестування. Це O (2 млн ), де n - кількість монет, m - цільова сума. Вводиться як " target\n[c,o,i,n,s].

/sM{yS*EQQ      (implicit Q's)
      *EQ       multiply coin list by target
     S          sort
    y           powerset (all subsequences)
   {            remove duplicates
 sM             sum all results
/        Q      count correct sums

9

Хаскелл, 37 байт

s%(h:t)=sum$map(%t)[s,s-h..0]
s%_=0^s

Використання декількох кратних першої монети hзменшує необхідну суму sдо негативного значення у зменшенні прогресії [s,s-h..0], яке потім необхідно скласти з рештою монет. Як тільки монет не залишилося, перевірте, чи сума арифметично дорівнює нулю 0^s.


Дивовижно, як ви потрапляєте точно на той самий кількість байтів, що і на @nimi, використовуючи інший підхід.
Kritzefitz

9

JavaScript (ES6), 51 48 байт

f=(n,a,[c,...b]=a)=>n?n>0&&c?f(n-c,a)+f(n,b):0:1

Приймає монети в будь-якому порядку. Намагається як використовувати, так і не використовувати першу монету, рекурсивно обчислюючи кількість комбінацій в будь-якому випадку. n==0означає суміщення комбінацій, n<0означає, що монети перевищують кількість, тоді як c==undefinedозначає, що монети не залишилося. Зауважте, що функція дуже повільна, і якщо у вас є копійка монети, наступна функція швидша (не передайте копійчану монету в масив монет):

f=(n,a,[c,...b]=a)=>c?(c<=n&&f(n-c,a))+f(n,b):1

... дангіт. Справжня приємна ідея.
ETHproductions

і що буде в результаті 1209 [1,5,10,33,48] і 6000 [1,5,10,33], щоб я міг відкалібрувати свій код
RosLuP

@RosLuP Даний код врешті-решт повертає 1314050 для вашого першого прикладу. Мій перекладач не може впоратися з рекурсією, необхідною для оцінки другого прикладу.
Ніл

@RosLuP Я змінив функцію, щоб припустити, що існує додаткова копійка монети, і вона повернула 22086484 за 6000 [5,10,33].
Ніл

@Neil ok 22086484 для 6000 [1,5,10,33] ... Натомість було б 11239 тут для 6000 [5,10,33] (масив, який ви написали)
RosLuP

7

Perl, 45 байт

Кількість байтів включає 44 байти коду та -pпрапора.

s%\S+%(1{$&})*%g,(1x<>)=~/^$_$(?{$\++})^/x}{

Приймає значення монети на першому рядку та цільову суму на другому рядку:

$ perl -pE 's%\S+%(1{$&})*%g,(1x<>)=~/^$_$(?{$\++})^/x}{' <<< "1 5 10 25
26"
13

Короткі пояснення:

-p                        # Set $_ to the value of the input, 
                          # and adds a print at the end of the code.
s%\S+%(1{$&})*%g,         # Converts each number n to (1{$&})* (to prepare the regex)
                          # This pattern does half the job.
(1x<>)                    # Converts the target to unary representation.
  =~                      # Match against.. (regex)
    /^ $_ $               # $_ contains the pattern we prepared with the first line.
     (?{$\++})            # Count the number of successful matches
     ^                    # Forces a fail in the regex since the begining can't be matched here.
    /x                    # Ignore white-spaces in the regex 
                          # (needed since the available coins are space-separated)
 }{                       # End the code block to avoid the input being printed (because of -p flag) 
                          # The print will still be executed, but $_ will be empty, 
                          # and only $\ will be printed (this variable is added after every print)

6

Желе , 10 9 байт

œċЀS€€Fċ

Спробуйте в Інтернеті!

Як?

œċЀS€€Fċ - Main link: coins, target
  Ѐ      - map over right argument, or for each n in [1,2,...,target]
œċ        - combinations with replacement, possible choices of each of n coins
    S€€   - sum for each for each (values of those selections)
       F  - flatten into one list
        ċ - count occurrences of right argument

2
+1 за використання такої кількості євро-символів у запитанні щодо грошей.
steenbergh

6

JavaScript (ES6), 59 байт

f=(n,c)=>n?c.reduce((x,y,i)=>y>n?x:x+f(n-y,c.slice(i)),0):1

Монети вводяться від найвищої до найнижчої, наприклад f(26,[100,25,10,5,1]). Якщо у вас є копійки, видаліть її та скористайтеся цією значно швидшою версією:

f=(n,c)=>n?c.reduce((x,y,i)=>y>n?x:x+f(n-y,c.slice(i)),1):1

Для цього використовується рекурсивна формула, подібна до @ nimi's. Я спочатку писав це кілька днів тому, коли виклик ще був у пісочниці; це виглядало так:

f=(n,c=[100,25,10,5])=>n?c.reduce((x,y,i)=>y>n?x:x+f(n-y,c.slice(i)),1):1

Єдина відмінність цього значення за замовчуванням c(він мав певне значення у вихідній задачі), і зміни 0в .reduceфункції1 (це було два байт коротше і через bazillion разів швидше c=[100,25,10,5,1]).


Ось модифікована версія, яка виводить усі комбінації, а не кількість комбінацій:

f=(n,c)=>n?c.reduce((x,y,i)=>y>n?x:[...x,...f(n-y,c.slice(i)).map(c=>[...c,y])],[]):[[]]

і що буде в результаті 1209 [1,5,10,33,48] та 6000 [1,5,10,33], щоб я міг відкалібрувати свій код
RosLuP

@RosLuP Я отримую 1314050 (через 5 хвилин) і переповнення стека (через годину) відповідно. Щойно я додав більш швидку версію, я отримую 1314050 і 22086484 протягом декількох секунд.
ETHproductions

У мого старого комп’ютера Pentium 2.8Gh 6 секунд для першого результату, протягом другого 5 хвилин + або -
RosLuP

5

PHP, 327 байт

function c($f,$z=0){global$p,$d;if($z){foreach($p as$m){for($j=0;$j<=$f/$d[$z];){$n=$m;$n[$d[$z]]=$j++;$p[]=$n;}}}else for($p=[],$j=0;$j<=$f/$d[$z];$j++)$p[]=[$d[$z]=>$j];if($d[++$z])c($f,$z);}$d=$_GET[a];c($e=$_GET[b]);foreach($p as$u){$s=0;foreach($u as$k=>$v)$s+=$v*$k;if($s==$e&count($u)==count($d))$t[]=$u;}echo count($t);

Спробуй це


5

Аксіома, 63 62 байт

1 байт збережено @JonathanAllan

f(n,l)==coefficient(series(reduce(*,[1/(1-x^i)for i in l])),n)

Цей підхід використовує функції генерації. Можливо, це не допомогло зменшити розмір коду. Я думаю, що це перший раз, коли в грі з «Аксіомою» я пішов так далеко, як визначити власну функцію.

Перший раз, коли функція називається, вона дає жахливе попередження, але все ж дає правильний результат. Після цього все добре, поки список не буде порожнім.


1
Я не знаю Аксіому - чи можна раніше прибрати простір for?
Джонатан Аллан

1
@JonathanAllan Так, так! Хороший інстинкт гольфу, дякую!
Крістіан Сіверс

5

R, 81 76 63 байт

Дякуємо @rturnbull за те, що ти граєш 13 байт!

function(u,v)sum(t(t(expand.grid(lapply(u/v,seq,f=0))))%*%v==u)

Приклад (зауважте, що c(...)ви передаєте вектори значень R):

f(12,c(1,5,10))
[1] 4

Пояснення:

u- бажане значення, v- вектор значень монети.

expand.grid(lapply(u/v,seq,from=0))

створює кадр даних з усіма можливими комбінаціями монет від 0 до k (k залежить від номіналу), де k є найнижчим таким, що k кратне значення цієї монети є щонайменше u (значення, яке потрібно досягти).

Зазвичай ми б використовували as.matrix щоб перетворити це в матрицю, але це багато символів. Замість цього ми беремо перенесення транспонування (!), Яке автоматично примушує його, але займає менше символів.

%*% vпотім обчислює грошову вартість кожного ряду. Останній крок - підрахувати, скільки цих значень дорівнює бажаному значенню u.

Зауважимо, що складність обчислювальної роботи та вимоги до пам'яті цього є жахливими, але так, це код гольфу.


1
Приємного використання expand.grid! І я люблю t(t())хитрість. Оскільки ваша функція включає лише один рядок коду, ви можете видалити фігурні дужки, заощадивши 2 байти. Крім того, ви можете переключитися do.call(expand.grid,lapply(u/v,seq,from=0))просто expand.grid(lapply(u/v,seq,f=0)), заощадивши 11 байт.
rturnbull

Дякую за це! Я ніколи не розумів, expand.gridщо брав би список як вхідний. Це ганьба, що ":"не добре працює з не цілими числами, інакше lapply(u/v,":",0)врятували б ще пару.
JDL

do.call(x,y)це те саме, що x(y), тому справа не в тому, які види введення приймаються. Якщо ви дійсно хочете використовувати :, я думаю, ви могли б використовувати lapply(u%/%v,`:`,0), але це те саме число байтів.
rturnbull

1
" do.call(x,y)є таким же, як x(y)" --- тільки якщо yце не список, який він є в цьому випадку. Погодьтеся, але з вашим другим пунктом.
JDL

3

J, 27 байт

1#.[=](+/ .*~]#:,@i.)1+<.@%

Використання

   f =: 1#.[=](+/ .*~]#:,@i.)1+<.@%
   12 f 1 5 10
4
   26 f 1 5 10 25
13
   19 f 2 7 12
2
   13 f 2 8 25
0

Пояснення

1#.[=](+/ .*~]#:,@i.)1+<.@%  Input: target T (LHS), denominations D (RHS)
                          %  Divide T by each in D
                       <.@   Floor each
                             These are the maximum number of each denomination
                     1+      Add 1 to each, call these B
                ,@i.         Forms the range 0 the the product of B
             ]               Get B
              #:             Convert each in the range to mixed radix B
     ]                       Get D
       +/ .*~                Dot product between D and each mixed radix number
                             These are all combinations of denominations up to T
   [                         Get T
    =                        Test if each sum is equal to T
1#.                          Convert as base 1 digits to decimal (takes the sum)
                             This is the number of times each sum was true

J настільки приголомшливий, але ще й такий божевільний
CommaToast

2

TSQL, 105 байт

З цими 4-ма типами монет можна впоратися лише до одного долара. Версія без вогків може обійтися приблизно в 4 долари, але дуже повільно - на моєму боксі це займає 27 секунд. Результат - 10045 комбінацій BTW

Гольф:

DECLARE @ INT = 100
DECLARE @t table(z int)
INSERT @t values(1),(5),(10),(25)
;WITH c as(SELECT 0l,0s UNION ALL SELECT z,s+z FROM c,@t WHERE l<=z and s<@)SELECT SUM(1)FROM c WHERE s=@

Безголівки:

-- input variables
DECLARE @ INT = 100
DECLARE @t table(z int)
INSERT @t values(1),(5),(10),(25)

-- query
;WITH c as
(
  SELECT 0l,0s
  UNION ALL
  SELECT z,s+z
  FROM c,@t
  WHERE l<=z and s<@
)
SELECT SUM(1)
FROM c
WHERE s=@
-- to allow more than 100 recursions(amounts higher than 1 dollar in this example)
OPTION(MAXRECURSION 0)

Скрипка


2

тинілісп репл , 66 байт

(d C(q((Q V)(i Q(i(l Q 0)0(i V(s(C(s Q(h V))V)(s 0(C Q(t V))))0))1

Рекурсивне рішення: намагається використовувати першу монету та не використовувати першу монету, після чого додає результати від кожної. Експоненціальна часова складність і відсутність хвостових рекурсій, але це обчислює тестові випадки просто чудово.

Unolfolf (ключ до вбудованих: d= визначити, q= цитувати, i= якщо, l= менше, ніж, s= відняти, h= голова, t= хвіст):

(d combos
 (q
  ((amount coin-values)
   (i amount
    (i (l amount 0)
     0
     (i coin-values
      (s
       (combos
        (s amount (h coin-values))
        coin-values)
       (s
        0
        (combos
         amount
         (t coin-values))))
      0))
    1))))

Приклад використання:

tl> (d C(q((Q V)(i Q(i(l Q 0)0(i V(s(C(s Q(h V))V)(s 0(C Q(t V))))0))1
C
tl> (C 12 (q (1 5 10)))
4
tl> (C 26 (q (1 5 10 25)))
13
tl> (C 19 (q (2 7 12)))
2
tl> (C 13 (q (2 8 25)))
0
tl> (C 400 (q (1 5 10 25)))
Error: recursion depth exceeded. How could you forget to use tail calls?!

1

PHP, 130 байт

function r($n,$a){if($c=$a[0])for(;0<$n;$n-=$c)$o+=r($n,array_slice($a,1));return$o?:$n==0;}echo r($argv[1],array_slice($argv,2));

99 байт-рекурсивна функція (і 31 байт виклику її), яка неодноразово видаляє значення поточної монети з цілі та називає себе новим значенням та іншими монетами. Підраховує кількість разів точно досягає цілі 0. Бігайте так:

 php -r "function r($n,$a){if($c=$a[0])for(;0<$n;$n-=$c)$o+=r($n,array_slice($a,1));return$o?:$n==0;}echo r($argv[1],array_slice($argv,2));" 12 1 5 10

Якщо зателефонувати з більш ніж 97 різними видами монети, вона загине рекурсійною смертю, не повертаючи нічого, але оскільки це набагато більше різних видів монети, то ми повинні підтримувати це добре.
користувач59178

1

Ракетка 275 байт

(set! l(flatten(for/list((i l))(for/list((j(floor(/ s i))))i))))(define oll'())(for((i(range 1(add1(floor(/ s(apply min l)))))))
(define ol(combinations l i))(for((j ol))(set! j(sort j >))(when(and(= s(apply + j))(not(ormap(λ(x)(equal? x j))oll)))(set! oll(cons j oll)))))oll

Безголівки:

(define(f s l)
  (set! l              ; have list contain all possible coins that can be used
        (flatten
         (for/list ((i l))
           (for/list ((j              
                       (floor
                        (/ s i))))
             i))))
  (define oll '())                    ; final list of all solutions initialized
  (for ((i (range 1  
                  (add1
                   (floor             ; for different sizes of coin-set
                    (/ s
                       (apply min l)))))))
    (define ol (combinations l i))          ; get a list of all combinations
    (for ((j ol))                           ; test each combination
      (set! j (sort j >))
      (when (and
             (= s (apply + j))              ; sum is correct
             (not(ormap                     ; solution is not already in list
                  (lambda(x)
                    (equal? x j))
                  oll)))
        (set! oll (cons j oll))             ; add found solution to final list
        )))
  (reverse oll))

Тестування:

(f 4 '[1 2])
(println "-------------")
(f 12 '[1 5 10])
(println "-------------")
(f 19 '[2 7 12])
(println "-------------")
(f 8 '(1 2 3))

Вихід:

'((2 2) (2 1 1) (1 1 1 1))
"-------------"
'((10 1 1) (5 5 1 1) (5 1 1 1 1 1 1 1) (1 1 1 1 1 1 1 1 1 1 1 1))
"-------------"
'((12 7) (7 2 2 2 2 2 2))
"-------------"
'((3 3 2) (2 2 2 2) (3 2 2 1) (3 3 1 1) (2 2 2 1 1) (3 2 1 1 1) (2 2 1 1 1 1) (3 1 1 1 1 1) (2 1 1 1 1 1 1) (1 1 1 1 1 1 1 1))

Після рекурсивного рішення є деяка помилка:

(define (f s l)                      ; s is sum needed; l is list of coin-types
  (set! l (sort l >))
  (define oll '())                   ; list of all solution lists
  (let loop ((l l)   
             (ol '()))               ; a solution list initialized
    (when (not (null? l))
        (set! ol (cons (first l) ol)))
    (define ols (apply + ol))        ; current sum in solution list
    (cond
      [(null? l) (remove-duplicates oll)]
      [(= ols s) (set! oll (cons ol oll))
                 (loop (rest l) '()) 
                 ]
      [(> ols s) (loop (rest l) (rest ol))
                 (loop (rest l) '())   
                 ]
      [(< ols s) (loop l ol) 
                 (loop (rest l) ol)
                 ])))

Не працює належним чином для:

(f 8 '[1 2 3])

Вихід:

'((1 1 1 2 3) (1 2 2 3) (1 1 1 1 1 1 1 1) (2 3 3) (1 1 1 1 1 1 2) (1 1 1 1 2 2) (1 1 2 2 2) (2 2 2 2))

(1 1 3 3) можливий, але не входить до списку рішення.


Я не знайомий з Ракеткою, але я написав рішення в Clojure за подібну проблему кілька років тому, якою скориставсяreduce
миль

"зменшити" не є частиною базової мови ракетки, хоча "скласти" є. Я додав модифіковане рішення вище, оскільки попереднє рішення має деяку помилку.
rnso

Схоже, купа любителів Lisp зібралися разом ... і зробили ракетку
Joe

1
Деякі ентузіасти лісповскіе перший зробив Scheme( groups.csail.mit.edu/mac/projects/scheme ) , який в кінці кінців привів до повномасштабної Racket( racket-lang.org , stackoverflow.com/questions/3345397 / ... )!
rnso

1

Желе , 15 байт

s+\Fṁḷ
2*BW;ç/Ṫ

Спробуйте в Інтернеті! або Перевірте всі тестові випадки.

Це було більше вправою написання ефективної версії в Jelly без використання вбудованих. Це засновано на типовому підході до динамічного програмування, який використовується для обчислення кількості способів внесення змін

Пояснення

s+\Fṁḷ  Helper link. Input: solutions S, coin C
s       Slice the solutions into non-overlapping sublists of length C
 +\     Cumulative sum
   F    Flatten
     ḷ  Left, get S
    ṁ   Mold the sums to the shape of S

2*BW;ç/Ṫ  Main link. Input: target T, denominations D
2*        Compute 2^T
  B       Convert to binary, creates a list with 1 followed by T-1 0's
          These are the number of solutions for each value from 0 to T
          starting with no coins used
   W      Wrap it inside another array
    ;     Concatenate with D
     ç/   Reduce using the helper link
       Ṫ  Tail, return the last value which is the solution

1

Власне , 15 байт

Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

╗;R`╜∙♂S╔♂Σi`Mc

Ungolfing

         Implicit input n, then the list of coins a.
╗        Save a to register 0.
;R       Duplicate n and create a range [1..n] from that duplicate.
`...`M   Map the following function over that range. Variable i.
  ╜        Push a from register 0.
  ∙        Push the i-th Cartesian power of a.
  ♂S       Sort each member of car_pow.
  ╔        Uniquify car_pow so we don't count too any duplicate coin arrangements.
  ♂Σ       Take the sum of each coin arrangement.
  i        Flatten the list.
c        Using the result of the map and the remaining n, push map.count(n).
         Implicit return.

0

Пітон, 120 байт

from itertools import*
lambda t,L:[sum(map(lambda x,y:x*y,C,L))-t for C in product(range(t+1),repeat=len(L))].count(0)

Грубі сили через усі комбінації монет до цільового значення (навіть якщо найменша не дорівнює 1).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.