문제

가 관련 문제가 하위 집합이 문제 합계 과 궁금하는 경우 차이점은 쉽게,즉풀 수 있는 합리적인 시간.

주어진 값 V,크기 L,와 숫자의 순서[1,N]S,얼마나 많은 크기 L 하위 집합의 합계보다 적 V?

이것은 다른 하위 합계 문제에서 세 가지 방법:

  1. 내가 얼마나 관심이 많은 하위 집합은 개 이상의 방법이 아니라,많 .
  2. 하위 집합의 크기는 고정되어 있습니다.
  3. I care 얼마나 많 설정 합계 보다는 더 적은 V,단지 여부는 어떤 존재합니다.

이 있는 합리적으로 효율적인 알고리즘이 이 문제를 해결할까요?

편집:분명히,이 작업을 수행할 수 있습니다 O(N 선택 L)조합을 사용하여 생성 알고리즘이 있습니다.내가 정말에 관심이 있는 똑똑한 해킹을 크게 그것이 과거.

도움이 되었습니까?

해결책

(의 결정 버전)도 문제가 NP-complete.아이디어는 우리가 할 수 있는 경우에,당신의 문제를 해결하기 위해 다음(각 하위 세기 말)할 수 있는 그는 얼마나 많은 설정 합계 보다는 더 적은 V 고 얼마나 많은 금액을 보다 적은 V-1,과의 차이가 그 두 번호를 말할 것인지 우리에게는 하위 합계가 정확하게 V-따라서 우리는 우리를 해결할 수 있는 하위 집합은 합계는 문제입니다.[이것은 완전한 증거이기 때문에,그것은 Turing 감소, 지 많은 하나 감소.]

그러나,거기에 간단한 동적 프로그래밍 솔루션에서 실행되는 시간(가톨릭).[이유 이하지 않는 것을 증명 P=NP V 될 수 있는 지수 입력 크기:n 비트는,당신은 값을 나타낼 수 있습까지 2n.하지만 가정 V 지수,이 문제가 되지 않습니다.]

자 num[v][k][i]나타내는 숫자의 크기-k 는 하위 집합의 첫 번째 나는 요소의 합을 v.을 계산할 수 있습니다 그들로(각 i):

    num[0][0][i] = 1
    for v = 1 to V:
        for k = 1 to L:
            num[v][k][i] = num[v][k][i-1] + num[v-S[i]][k-1][i-1]

S[i]이드는 요소에서 당신의 순서.(세트의 크기는 금액을 v 거나 사용하지 않 S[i],그래서 그것은 수로 계산되 num[v][k][i-1],또는 그 사용하 S[i]것을 의미하는의 나머지 일부는 k-1 의 요소를 사용한 첫 번째 나-1 순서대로 번호,및 합계 v-S[i].) 마지막으로,수 num[v][L][|S|]각 v 보 V;그의 대답이다.

또한 생략할 수 있습니다 세 번째로 아래 첨자 할 경우 주의깊게(실행하는 루프고 아래로 각 i,etc.);나는 단지 그것을 포함한다.

다른 팁

내가 준비하지 않는 증명서를 제시 하지만,그 소리를 순종하는 동적인 프로그래밍 방식:분석의 목록 하위 집합의 크기 2use 그들을 컴퓨터의 하위 집합의 크기는 3 등,그래서는 hyou 만을 검사하의 작은 컬렉션을 전망이다.

하나의 최적화는 마음에 오는 이것:기 위해 귀하의 시퀀스(는 경우 alerady 지 않도).첫번째 선택 L-1 항목에서의 시작한 다음 선택 마지막 항목은,그것의 가장 큰 가치는(옆에서 가장 큰 값 순서를 제공 합 너무 큰).나머지는 폐기의 순서,해당 항목이 있기 때문에 수 없는 부분의 유효한 하위 집합은 어쨌든.

그 후 나는 그것의 전체 다시 검색하십시오.하지만 그런 다음 다시 수 있는 다른 optimiziations 도 가능합니다.

동적 프로그래밍 솔루션의 일부 sum 문제가 생성 테이블을 포함하는 이 대답은(즉,부울의 테이블 V N 어디 V 의 최대 개수 요소 및 최대 수의할 수 있는 항목에 설정을 satisifies 제약;각 부울되는 경우 true <=N 요소 합계 <=V).그래서 만약 N*V 이 너무 크지 않은,당신을 위해 용인 가능한 수준으로 빠른 알고리즘이 존재합니다.하위 집합을 합 솔루션은 가장 높은 설정한 요소에 대해 이 테이블에 있는 요소의 수은 <=N/2.

경우 양의 정수,당신이 할 수 있는 단계 검증 해야 하는 경우;

을의 합 L1 가에서 정수 설정합니다.는 경우에는 합 X n X 해야 합 아래는 가장 큰 요소에 문제가 있는 경우 를 해결책을 가지고 있습니다.그것을 생각하는,당신은 당신을 삭제할 수 있는 다른 L 이 방법...

하게 하는 것은 당신이 지정하는 크기=L 다음 경우에도 당신은 아무것도 생각할 수 없는 영리하고 그냥 무력을 사용해야(N 선택 L)는 별도의 합계 최악의 경우에는,그래서 그것보다 조금 더 나은 n^^L(론,L+1,당신은 그 합계 각 하위 집합).

이 같은 소리 n 선택 k 카테고리의 문제입니다.성 k-의 하위 집합 n 에 덮여 Skiena 의 알고리즘 디자인 매뉴얼,그리고 책은 건 열거한 관련 하위 집합에서 문자 주문(반복적으로,예를 들어).다음의 합계와 비교에서 각 하위 집합.

이 있는 경우 정정,당신은 아마도 자두 불가능한 솔루션에서 솔루션을 공간이다.

아마도 동적 프로그래밍 제제 amenamble 을 PTAS 의 FPTAS.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top