Seja uma instância da soma do subconjunto, onde é uma lista (conjunto múltiplo) de números e é a soma alvo. Deixe . Deixe- ser a lista formada por adição de a .( L , B )euBS= ∑ Leu′S+ B , 2 S- Beu
(1) Se houver uma sub-lista somando , então pode ser particionado em duas partes iguais: e . De fato, a primeira parte é somada a , e a segunda a .B L ′ M ∪ { 2 S - B } L ∖ M ∪ { S + B } B + ( 2 S - B ) = 2 S ( S - B ) + ( S + B ) = 2 SM⊆ LBeu′M∪ { 2 S- B }L ∖ M∪ { S+ B }B + ( 2 S- B ) = 2 S( S- B ) + ( S+ B ) = 2 S
(2) Se pode ser dividido em duas partes iguais , então existe uma sub-lista de soma de . De fato, desde que e cada parte é igual a , os dois elementos pertencem a partes diferentes. Sem perda de generalidade, . O resto dos elementos em P_1 pertence a L e soma para B .P 1 , P 2 L B ( S + B ) + ( 2 S - B ) = 3 S 2 S 2 S - B ∈ P 1 P 1 L Beu′P1, P2euB( S+ B ) + ( 2S- B ) = 3 S2 S2 S- B ∈ P1P1euB
A resposta mencionada por @Yuval Filmus está incorreta (está correta APENAS se não houver números inteiros negativos). Considere o seguinte multiset:
e a soma alvo é . Sabemos que não há subconjunto. Agora, construímos a instância para o problema da partição. Os dois novos elementos adicionados são e . O multiset agora é: e a soma total é .2 σ - t = 12 σ + t = 3 { - 5 , 2 , 2 , 2 , 2 , 2 , 3 , 12 } 20−2 2σ−t=12 σ+t=3
O problema da partição resolve a resposta, fornecendo o subconjunto Aqui, os 2 novos elementos estão no mesmo subconjunto (não há outra maneira de particionar na metade da soma). Portanto, este é um exemplo contrário. A resposta correta é a seguinte:
Adicione um elemento cujo valor seja . A soma total do multiset agora é . Resolva o problema de partição que fornecerá 2 subconjuntos da soma . Apenas uma das partições conterá o novo elemento. Escolhemos a outra partição cuja soma é e resolvemos o problema do subconjunto, reduzindo-o a um problema de partição. Isto é o que o link explica.2t−σ 2t t t
fonte
Aqui está uma prova direta:
É fácil ver que SET-PARTITION pode ser verificado em tempo polinomial; dada uma partição apenas soma os dois e verifica se suas somas são iguais, o que obviamente é uma verificação de tempo polinomial (porque o somatório é uma operação polinomial e estamos executando apenas no máximo muitos somatórios).P1,P2 |X|
O núcleo da prova está na redução de SUBSETSUM a PARTITION; para esse fim, dado o conjuntoX e um valor t (a consulta de soma do subconjunto), formamos um novo conjunto X′=X∪{s−2t} onde s=∑x∈Xx . Para ver que isso é uma redução:
(⟹ ) suponha que exista algum S⊂X tal que t=∑x∈Sx então teríamos que s−t=∑x∈S∪{s−2t}x,
s−t=∑x∈X′∖(S∪{s−2t})x
e teríamos esse S∪{s−2t} eX′∖(S∪{s−2t}) formar uma partição deX′
(⟸ ) Suponha que exista uma partição P′1, P′2 de X′ tal que ∑x ∈ P′1x = ∑x ∈ P′2x . Observe que isso induz uma partição natural P1 e P2 de X tal modo que WLOG temos s - 2 t + ∑x ∈ P1x = ∑x ∈ P2x
⟹s - 2 t + ∑x ∈ P1x + ∑x ∈ P1x = ∑x ∈ P2x + ∑x ∈ P1x = s
⟹s - 2 t + 2 ∑x ∈ P1x = s
⟹∑x ∈ P1x = t
Por isso, a partir de uma solução det = ∑x ∈ Sx que pode formar um parition P1= S∪ { s - 2 t } , P2= X′∖ ( S∪ { s - 2 t } ) e, inversamente, a partir de uma partição P′1, P′2 podemos formar uma solução t = ∑x ∈ P′1S { s - 2 t }x e, portanto, o mapeamentof: ( X, t ) → X′ é uma redução (porque( X, T ) está no idioma / conjunto SUBSETSUM⇔ X′= f( X, T ) é no idioma / set PARTITION) e fica claro que a transformação foi feita em tempo polinomial.
fonte
Soma do subconjunto:
Entrada: {a1, a2, ..., am} st M = {1..m} e ai são números inteiros não negativos e S⊆ {1..k} e Σai (i∈S) = t
Partição:
Entrada: {a1, a2, ..., am} e S⊆ {1, · · ·, m} st ai (i∈S) = Σaj (j∉S)
Prova de partição Np: se o prover fornecer partições (P1, P2) para o verificador, o verificador poderá calcular facilmente a soma de P1 e P2 e verificar se o resultado é 0 em tempo linear.
NP_Hard: SubsetSum ≤p PARTITION
Seja x entrada de SubsetSum e x = 〈a1, a2, ..., am, t〉 e Σai (i de 1 para m) = a
Caso1: 2t> = a:
Seja f (x) = 〈a1, a2, ..., am, am + 1〉 onde am + 1 = 2t − a
Queremos mostrar que x∈SubsetSum ⇔ f (x) ∈PARTITION
então existe S⊆ {1, ..., m} st T = {1..m} - S e Σai (i∈T) = em
e Seja T '= {1 ... m, m + 1} - S so Σaj (j∈T') = a-t + 2t-a = t
que é exatamente Σai (i∈S) = te mostra f (x) ∈PARTIÇÃO
Agora também mostraremos que f (x) TIPARTIÇÃO ⇔ x∈SubsetSum
então existem S⊆ {1, ..., m, m + 1} st T = {1, ..., m, m + 1} - S e Σai (i∈T) = [a + (2t-a ) -t] = t
e mostra Σai (i∈T) = Σaj (j∈S), então m + 1∈T e S⊆ {1, · ·, m} e Σai (i∈S) = t
então x∈SubsetSum
Caso 2: 2t = <a :
podemos verificar o mesmo, mas desta vez am + 1 é − 2t
fonte
esse link tem uma boa descrição de ambas as reduções, partição para soma do subconjunto e soma do subconjunto para partição. Eu acho que é mais óbvio do que a resposta de YUVAL . link útil
fonte