N 개의 코인과 각 명칭을 사용한 코인 변경 문제 열거


13

동전 변경 문제는 아주 잘 설명되어 있습니다. 교단의 동전의 무한한 공급을 감안할 때 x_1까지 x_m당신을 추가 조합의 수를 찾아야합니다 y. 예를 들어, 주어진 x = {1,2,3}것과 y = 4우리는 네 가지 조합이 있습니다 :

  1. {1,1,1,1}
  2. {1,1,2}
  3. {1,3}
  4. {2,2}

소개

코인 변경 문제에는 몇 가지 변형이 있습니다. 이 변형에는 두 가지 추가 제한 사항이 있습니다.

  1. 모든 명칭은 한 번 이상 사용해야합니다.
  2. 정확히 고정 된 수의 동전을 사용해야합니다.

예를 들어, 주어진 x = {1,2,3}, y = 36그리고 n = 15어디에 n사용되어야 동전의 총 수는, 우리는 네 개의 조합을 얻을 :

  1. {1,2,2,2,2,2,2,2,3,3,3,3,3,3,3} (1 대, 7 대, 7 대)
  2. {1,1,2,2,2,2,2,3,3,3,3,3,3,3,3} (2 1, 5 2, 8 3)
  3. {1,1,1,2,2,2,3,3,3,3,3,3,3,3,3} (3, 3, 9, 3)
  4. {1,1,1,1,2,3,3,3,3,3,3,3,3,3,3} (4 1, 1 2, 10 3)

도전

문제는 enumerate위에서 설명한대로 모든 조합을 열거하는 원하는 언어로 함수를 작성하는 것 입니다.

  1. 교파 목록. 예를 들어 {1,5,10,25}. 목록이나 배열을 사용할 수 있습니다.
  2. y모든 조합의 합계를 나타내는 음이 아닌 정수 입니다.
  3. n총 코인 수를 나타내는 음이 아닌 정수 입니다.

논증의 순서는 중요하지 않습니다. 포인트 프리 기능이 허용됩니다.

enumerate함수 의 출력은 조합 목록이어야합니다. 각 조합은 고유해야 n하며을 더한 정수 목록이어야합니다 y. 모든 교파는 각 조합에서 적어도 한 번 나타나야하며 조합이 누락되어서는 안됩니다. 정수와 조합의 순서는 중요하지 않습니다. 출력에 목록 또는 배열을 사용할 수 있습니다.

다음과 같은 경우를 명심하십시오.

  1. 두 경우 y와는 n제로이며, 교단의 목록이 비어 후 출력 한 조합의 목록입니다 빈 조합 (예 {{}}).
  2. 그렇지 않으면, y0 n이 0이거나 교단 목록이 비어 있으면 출력은 0 조합 목록입니다 (예 :) {}.
  3. 더 일반적으로, y교파의 합보다 작거나 교파 n의 수보다 작 으면 출력은 0 조합 목록입니다.

스코어링은 전체 프로그램의 크기 (바이트)를 기반으로합니다. 여기에는 enumerate함수, 도우미 함수, import 문 등이 포함됩니다. 테스트 사례는 포함되지 않습니다.


이 어딘가에서이 도전을 보았을 것입니다 ...
Leaky Nun

이 질문이 중복되지 않기를 바랍니다. Code Golf에서 같은 질문을 찾지 못했습니다. 따라서 게시했습니다.
Aadit M Shah

@PeterTaylor y교단의 합보다 작 으면 재귀 솔루션의 어느 시점에서 교단 목록이 비어있는 기본 사례에 도달합니다. 따라서 답은 {}(즉 해결책을 찾을 수 없음)입니다. 경우 n적은 교단의 수보다 당신은 결국 어디에 기본 케이스에 도달 할 수 있습니다 n = 0y != 0. 따라서 대답은 다시 될 것 {}입니다.
Aadit M Shah

@PeterTaylor 실제로. 구현 세부 사항에 대해 너무 많이 가정했을 수 있습니다. 그 문제를 해결하는 방법을 알고 있습니까?
Aadit M Shah

10
답변을 얻을 때까지 "Accepted"플래그를 제거하는 것이 좋습니다. 그리고 일반적으로 수락하기 전에 며칠을 기다리는 것이 합리적입니다.
피터 테일러

답변:


2

05AB1E, 20 바이트

g-¹sã€{Ùvy¹«DO³Qiˆ}¯

입력 순서이다 : list of values, nr of coins, sum to reach.

간단히 설명

  1. 코인 길이 목록의 모든 순열을 가져옵니다. final length - length of unique coin list
  2. 이 목록에 고유 동전 목록을 추가하십시오.
  3. 합계가 찾는 합계와 같으면 목록을 저장하십시오.
  4. 저장된 모든 목록 출력

온라인으로 사용해보십시오

온라인 컴파일러는 많은 수의 동전을 처리 할 수 ​​없습니다.


4

MATL , 22 바이트

Z^!S!Xu!tsi=Z)"1G@m?@!

입력 순서는 액면 배열, 취한 코인 수 ( n), 원하는 합계 ( y)입니다.

각 조합은 다른 줄에 표시됩니다. 빈 출력은 빈 문자열로 표시되므로 아무 것도 표시되지 않습니다.

온라인으로 사용해보십시오!

도전 과제의 예를 위해 온라인 컴파일러의 코드 메모리가 부족하지만 합리적으로 최신 표준 컴퓨터에서 오프라인으로 작동합니다.

>> matl
 > Z^!S!Xu!tsi=Z)"1G@m?@!
 > 
> [1 2 3]
> 15
> 36
1 1 1 1 2 3 3 3 3 3 3 3 3 3 3
1 1 1 2 2 2 3 3 3 3 3 3 3 3 3
1 1 2 2 2 2 2 3 3 3 3 3 3 3 3
1 2 2 2 2 2 2 2 3 3 3 3 3 3 3

설명

Z^      % Implicitly input array of denomminations and number of coins n. Compute 
        % Cartesian power. This gives 2D array with each "combination"
        % on a different row
!S!     % Sort each row
Xu      % Deduplicate rows
!       % Transpose: rows become columns. Call this array A
ts      % Push a copy, compute sum of each column
i       % Input y (desired sum)
=       % Logical array that contains true if the "combination" has the desired sum
Z)      % Keep only those columns in array A
"       % For each column
  1G    %   Push array of denominations again
  @     %   Push current column
  m     %   Is each denomination present in the column?
  ?     %   If so
    @!  %     Push current column again. Transpose into a row
        %   End if
        % End for
        % Implicitly display stack contents

3

파이썬 3 120 106 바이트

from itertools import*
lambda d,t,l:[i+d for i in combinations_with_replacement(d,l-len(d))if sum(i+d)==t]

(x_1, x_2, x_3 ... , x_k)인수를 통해 폼의 튜플, 대상 값 및 동전 수를 입력하고 폼의 튜플 목록을 반환 하는 익명 함수입니다 [(solution_1), (solution_2), (solution_3), ... (solution_k)].

작동 원리

Itertoolscombinations_with_replacement기능은 l-len(d)교단의 교체와 함께 모든 조합 을 생성하는 데 사용됩니다 . d이러한 각 조합에 추가 하면 각 명칭이 적어도 한 번 나타나고 새 조합의 길이가 보장됩니다 l. 조합의 요소가에 합산 t되면 조합이 반환 목록에 튜플로 추가됩니다.

Ideone에서 사용해보십시오


108 바이트의 대체 방법

from itertools import*
lambda d,t,l:set(tuple(sorted(i+d))for i in product(d,repeat=l-len(d))if sum(i+d)==t)

(x_1, x_2, x_3 ... , x_k)인수를 통해 양식의 튜플, 대상 값 및 동전 수를 입력하고 양식의 튜플 세트를 반환 하는 익명 함수입니다 {(solution_1), (solution_2), (solution_3), ... (solution_k)}.

작동 방식 (다른 버전)

product기능을 사용하여 교파의 itertools모든 l-len(d)배열 을 생성합니다 . d이러한 각 조합에 추가 하면 각 명칭이 적어도 한 번 나타나고 새 조합의 길이가 보장됩니다 l. 조합의 요소가에 합산 t되면 조합이 정렬되어 목록에서 튜플로 변환 된 다음 반환 튜플에 추가됩니다. 마지막으로 호출 set하면 중복이 제거됩니다.

Ideone (다른 버전) 에서 사용해보십시오


0

자바 스크립트 (ES6), 135 바이트

g=(a,n,y,r)=>n>0?y>0&&a.map((x,i)=>g(a.slice(i),n-1,y-x,[...r,x])):n|y||console.log(r)
(a,n,y)=>g(a,n-a.length,a.reduce((y,x)=>y-x,y),a)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.