부분 집합 : 일반적인 경우에 특수 감소


20

Wikipedia 는 하위 집합 합계 문제가 주어진 정수의 여러 하위 집합을 찾는 것으로서 그 합계는 0입니다. 또한 그것은 합 서브셋 발견에 해당한다고 s 주어진 위해 s .

그래서 나는 그것들이 동등하다는 것을 믿습니다. 중 하나 s 제로를 설정하여 사소한 s=0 . 그러나 나는 0에서 감소 찾는 운이 없었다 s , 정수의 집합 주어진 즉 A , 정수의 집합 구성 B 합 일부 포함 s (어떤을위한 s ) 경우에만의 부분 집합으로이 경우 와 합계 0.A

당신은 몇 가지 포인터를 줄 수 있습니까?

답변:


11

실제로 이미 특별에서 일반으로 축소되었습니다. 을 설정 하면 기본적으로 일반적인 알고리즘을 사용하여 특수 문제를 해결합니다.s=0

다른 방법으로 (일반에서 특수으로 축소) :

한 세트의 주어진 가정 및 개수 K 하면 어떤 서브 세트가 있는지 확인해야 S 에 합산 K가 .S={x1,,xn}KSK

이제 일부 하위 집합의 합이 인지 확인할 수있는 알고리즘을 고려하여이 문제를 해결하려고합니다 .0

이제 경우 : 우리는 쉽게 감소가 S를 ' = { X 1 , X 2 , ... , X N , - K } .xi>0S={x1,x2,,xn,K}

합계 서브 세트 가지고 0 IFF에 S는 합계의 서브 세트 갖고 K가 .S0SK

우리가 할 수있을 때 문제가 발생 의 일부 난을 .xi0i

이라고 가정 할 수 있습니다 (왜?).K>0

양의 의 합 이 P 이고 음의 x iN 이라고 가정합니다 .xiPxiN

이제 새로운 세트 을 구성하십시오.S={y1,y2,yn}

여기서 M = P + | N | + K .yi=xi+MM=P+|N|+K

입니다.yi>0

이제 세트에서 zero-subset-sum 알고리즘을 실행하십시오.

S{(K+M)}

S{(K+2M)}

S{(K+3M)}

S{(K+nM)}

에 합계 K 의 부분 집합이있는 경우 , 위 세트 중 하나 이상에 합계 0의 부분 집합이 있음을 쉽게 알 수 있습니다.SK

나는 당신에게 다른 방향의 증거를 남길 것입니다.


대단히 감사합니다. 0-subset-sum의 인스턴스를 K-subset-sum 의 하나의 ( 대신 ) 인스턴스로 변환하는 축소가 있습니까? n
ipsec

@ipsec : K-subset-sum 인스턴스를 0-subset-sum으로 변환하는 것을 의미합니까? 아마도 위 의 세트를 합체 하면 효과가 있습니다. n
Aryabhata

글쎄, 나는 실제로 내가 엄격한 방향을 가지고 있는지 두 번 생각하고있었습니다. 사실 K-subset-sum이 모든 K에 대해 NP-hard임을 보여주고 싶을 때, 0-subset-sum이 NP-hard라면 0-subset-sum에서 K-subset-sum으로 축소를 사용할 수 있습니다 0- 인스턴스에서 K- 인스턴스로 폴리 타임 변환이 필요합니다. 그러나 이것이 실제로 내 질문에 묻은 것이 확실하지 않습니다.
ipsec

@ipsec : set 이라고 말하면 0-subset-sum의 NP-Hardness를 고려하여 K -subset-sum 의 NP-Hardness를 보여줍니다 . 일반적인 문제는 적어도 특별한 문제만큼 어렵습니다. 축소 조건에서는 제로 서브 세트 합계를 K 서브 세트 합계로 줄었다는 것을 참고하십시오 . 또한 K입력 입니다. " K " 를 말할 때 정확히 무엇을 의미합니까? 위의 답변은 특별한 경우 (zero-subset-sum)가 일반적인 경우 ( k -subset-sum, 여기서 k 는 입력) 와 같이 단단합니다 (NP 경도 의미 ). s=0KKKKkk
Aryabhata

신경 쓰지 마. 내가 원래 궁금했던 것은, 만약 우리가 0-subset-sum이 NP-hard라는 것을 안다면, 우리는 1-subset-sum도 역시 파생 될 수 있는가? Wikipedia는 그렇게 말하지만 적절한 감축을 찾고있었습니다. 그러나 나는 이제 내 말이 완전히 엉망이되어 실제로 반대를 요구하고 있음을 알았습니다. 어쨌든 주어진 정수 K 및 L에 대해 K-subset-sum 인스턴스에서 L-subset-sum 인스턴스로 줄이기에 충분한 입력을 제공 했으므로 내 문제는 여전히 해결되었습니다.
ipsec

0

Aryabhata의 답변 은 모든 숫자에 큰 c 곱한 다음 각 숫자에 작은 것을 추가하여 "프레즌스 태그"처럼 작동 한 다음 추가 할 수있는 숫자를 제공함으로써 해결할 수 있습니다. 우리가 그들없이 c K에 도달 할 수 있다면 우리는 0에 도달해야 한다. 특히 존재 태그로 c = 2 ( n + 1 ) 및 1을 사용합니다.cKc=2(n+1)

대상 값 K 에 대한 일반 문제 의 인스턴스 (S={x1,,xn},K) 가 주어지면 다음을 포함하는 특정 문제의 인스턴스 (대상 값 0)를 작성합니다.K

  • Y={y1,,yn} , 여기서yi=2(n+1)xi+1 입니다.
  • 번호 z=2K(n+1)n .
  • n1"풀업 (Pull-up)"번호라고하는 숫자 1의 n 1 개.

나는 Aryabhatta가 K 가 긍정적 이라고 가정 합니다. (6 년이 지났으므로 독자를위한 그의 운동에 대답 할 것입니다. 우리가 할 수있는 이유는 K를 포함한 일반적인 문제의 인스턴스에서 모든 숫자 의 부호를 바꾸면 우리는 새롭고 동등한 문제 인스턴스 즉, 양의 K 인스턴스 를 해결하는 알고리즘은 문제를 해결하기에 충분합니다. 음의 K 를 가진 인스턴스를 해결하려면 이 부호 교환을 수행하고 해당 알고리즘을 실행하며 다음과 같이 답변을 전달할 수 있습니다. 원래 질문에 대한 답입니다. 물론 K = 0 인 경우KKKK=0 우리는 일반적인 경우를 특별한 경우로 변환 할 필요가 없습니다!)

먼저 일반적인 문제의 주어진 사례에 대한 YES 대답은 특별한 문제의 구성된 사례에 대한 YES 대답을 의미한다는 것을 보여 주자. 여기에서 우리는 가정 할 수있는 몇 가지 솔루션 {xj1,,xjm} 일반적인 문제는 존재한다 : 즉,이 비어 있지 않은 모음 m 의 숫자 합계 K . 우리가 대응 취할 그렇다면 y -values {yj1,,yjm} 구성된 경우에 우리의 용액에, 그들은 합계로한다 2K(n+1)+m 입니다. 우리는 다음을 포함하도록 선택할 수 있습니다2K(n+1)n 솔루션에서의 합으로 우리를 떠나mn . 1mn 이기 때문에[n+1,0] 범위에 있으며 풀업 번호의 일부를 포함하여 0까지 올릴 수 있습니다.

2(n+1)

{yj1,,yjm}mY[1,n1]zz=2K(n+1)nnn1

zY2(n+1)nYn1Yn+n1=2n12(n+1)z2(n+1)Y2(n+1)2(n+1)z=2K(n+1)n

z

(2K(n+1)n)+i=1m(2(n+1)xji+1)+pull-ups=0

용어를 재정렬 할 수 있습니다.

2K(n+1)+i=1m(2(n+1)xji)(n+i=1m1+pull-ups)=0

2K(n+1)+i=1m(2(n+1)xji)(n+m+pull-ups)=0

2(n+1)(K+i=1mxji)(n+m+pull-ups)=0

2(n+1)2(n+1)

(n+m+pull-ups)=0

이것은 이전 방정식으로 직접 대체되어 얻을 수 있습니다.

2(n+1)(K+i=1mxji)=0

마지막으로 양쪽을 으로 나눕니다.2(n+1)

K+i=1mxji=0

원래의 일반적인 문제 인스턴스에 대한 솔루션을 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.