다음은 시작하는 데 도움이되는 힌트입니다. 정수의 파티션 세트를 열거 하기 위해 표준 동적 프로그래밍 알고리즘 을 적용 하고, 모든 합계를 반복적으로 확인 하고 변경 하고 고유성을 확인 하여 고유 한 변경을 수행 할 수있는 논리를 추가하는 논리를 추가하십시오 .
좀 더 자세히 설명하면 : 다중 집합 가 있다고 가정하십시오 . 숫자 감안할 때 함께 , 어떻게의 submultiset 식별 할 수 에 총액 것을 ? 해당 하위 다중 집합이 고유한지 어떻게 확인할 수 있습니까? 변경을 위해 표준 동적 프로그래밍 기술 을 적용하십시오 . ( 이 질문 도 참조하십시오 .)i 1 ≤ i ≤ n S iSi1≤i≤nSi
multiset의 감안할 때 , 당신은 어떻게 확인할 수 1에서 모든 숫자인지 즉, 그것은 만족 두 번째 조건, 여부 고유의 submultiset의 합으로 표현 될 수 (고유 변경 결정 조건)? 이전 문제를 해결하면 매우 쉽습니다.N SSnS
하자 당신의 조건을 모두 만족하는 멀티 세트의 목록을 나타낸다. 을 알고 있다면 어떻게 그 정보를 사용하여 있습니까? 정수의 파티션을 열거하기 위해 표준 동적 프로그래밍 기술을 적용 할 수 있습니다.P ( 1 ) , P ( 2 ) , … , P ( n ) P ( n + 1 )P(n)P(1),P(2),…,P(n)P(n+1)
아마도 더 나은 접근법이 있습니다.
가 두 조건을 모두 만족시키는 다중 집합이라고 가정 합니다 ( ). 요소가 하나 더 있는 멀티 세트 를 얻기 위해 어떻게 확장 할 수 있습니까? 다시 말해, 에 하나 이상의 요소를 추가 하여 두 조건을 모두 만족시키는 새로운 다중 집합 를 얻는 방법을 어떻게 식별 할 수 있습니까 (일부 )?SnTSTn′
답 : 만약 의 일부 구성 요소들의 합으로서 표현 될 수 , 다음에 추가 소용 없다 야기 : 고유성 조건을 위반이. 따라서 의 일부 요소의 합으로 표현할 수없는 모든 정수 를 열거 할 수 있습니다 . 각각은 두 가지 조건을 충족시키는 새로운 다중 집합 를 얻기 위해 에 추가 될 수있는 것입니다 (다른 ).xSSTxSSTn
또한 의 일부 요소의 합으로 표현할 수있는 정수 와 동적 프로그래밍을 사용하지 않는 정수를 열거 할 수 있습니다 . 부울 의 2 차원 배열 을 작성합니다. 여기서 정수 를 일부의 합으로 표현하는 방법이 있으면 는 참 입니다. 제 의 요소 (첫 번째 요소 사용에 적격 여기서, , 이렇게 정렬 된 및 ). 참고SA[1…|S|,1…n]A[i,j]jiSiSSS={s1,s2,…,sk}s1≤s2≤⋯≤skA[i,j] 의 값을 사용하여 계산할 수 있습니다 . 특히, 이면 , 그렇지 않으면 입니다. 이를 통해 추가 될 후보 인 모든 숫자를 식별 할 수 있습니다 .A[1…i−1,1…j−1]A[i,j]=A[i−1,j]∨A[i−1,j−si]j>siA[i,j]=A[i−1,j]S
다음으로, 각각의 후보에 대한 확장 의 (하나 개의 원소 첨가 한 ), 우리는 여부를 확인하고자하는 만족하는 조건을 모두. 하자 의 요소들의 합 나타낸다 하고, 의 요소의 합계 . 범위의 모든 정수 를 요소의 합계로 표현할 수 있는지 확인해야합니다 . 동적 프로그래밍을 사용하고 변경을위한 표준 알고리즘을 사용하여이 문제를 해결할 수도 있습니다. (사실, 여전히 배열 가있는 경우TSSTnSn′Tn+1,n+2,…,n′TA위에서 언급 한 것처럼이 문제를 해결하기 위해 쉽게 확장 할 수 있습니다. 배열 로 만들고 추가 항목을 모두 채우고 계속 확인하십시오. 는 모두 참입니다.) 이제 확장되는 모든 다중 집합 를 열거 할 수 있습니다. 단일 요소에 의한 이며 두 조건을 모두 만족합니다.A[1…|T|,1…n′]T SA[|T|,n+1],A[|T|,n+2],…,A[|T|,n′]TS
이것은 즉시 모든 에서 어떤 경계까지 과 같이 조건을 만족하는 모든 다중 집합 를 열거하는 알고리즘을 제안합니다 . 우리는 배열을 가지게 되는데, 여기서 는 에 합산되는 모든 다중 집합 를 저장하고 , 일반적으로 은 합산되는 모든 다중 집합 집합을 저장합니다 .n n ≤ 20 P [ 1 … 20 ] P [ 5 ] S P [ n ] S nSnn≤20P[1…20]P[5]SP[n]Sn
다음으로 반복해서 채울 수 있습니다 . 하나의 다중 집합 만 포함하도록 을 설정하여 시작하십시오 . 각각 다음에, 각각 (1 내지 20 카운트 업) 가능한 모든 정보 열거 의 , 있도록 (상기 기술을 이용하여) 의 요소들의 합 나타내는 , 인서트 로 가 존재하지 않는 경우와 만약 .P [ 1 ] { 1 } n S ∈ P [ n ] T S n ' T T P [ n ' ] n ' ≤ 20P[n]P[1]{1}nS∈P[n]TSn′TTP[n′]n′≤20
이것은 꽤 할 수 있어야합니다. 행운을 빕니다! 즐기세요! 세부 사항을 다루는 것은 동적 프로그래밍에서 좋은 학습 연습이 될 것입니다.