Você está na página 1de 25

Soma de Subconjuntos

Gustavo Sada
Definição do Problema
Sendo S um conjunto finito de inteiros positivos e t um
inteiro positivo, temos o seguinte problema de decisão:

Há um subconjunto S' de S tal que a soma de todos


elementos desse subconjunto é t?
Exemplo
Para S = {1, 2, 3, 8, 15, 17, 56, 90, 137, 352},
t = 172,
Exemplo
Para S = {1, 2, 3, 8, 15, 17, 56, 90, 137, 352},
t = 172,

S’ = {1, 2, 15, 17, 137}


S’ = {3, 15, 17, 137}
S’ = {1, 8, 17, 56, 90}
Exemplo de solução possível em python
Prova NP
Inicialmente vamos verificar que existe um algoritmo que
verifica a correção da solução em tempo polinomial
Algoritmo de Verificação NP
Complexidade:

1- Verificar que os elementos existem


no conjunto original

2- Verificar que a soma é correta

O(n^2) + O(n) = O(n^2)

Logo, é possível verificar a corretude


da solução em tempo polinomial e o
problema pertence à classe NP
Prova NP-Difícil
Vamos reduzir uma instância do 3-SAT (NP-Completo) para
a soma de subconjuntos. Assim provando que a soma de
subconjuntos também pertence à classe NP-difícil.
Definição do 3-SAT
Consiste em satisfazer uma expressão booleana constituída
por cláusulas, em que cada uma possui 3 literais distintos
Definição do 3-SAT
Consiste em satisfazer uma expressão booleana constituída
por cláusulas, em que cada uma possui 3 literais distintos

X1 = 0, X2 = 0, X3 = 1 → b é satisfazível
Redução
Premissas:

- Nenhuma cláusula pode conter uma variável e sua negação


- Todas variáveis aparecem em alguma cláusula
Redução
Ideia: criamos uma tabela em que cada linha configura um número do conjunto S
da soma de subconjuntos. Os dígitos de cada número serão definidos pelo
problema do 3-SAT usando variáveis e cláusulas como colunas. A última coluna
contém um valor pré-definido, cuja soma de cada coluna deve alcançar, de forma
a solucionar o 3-SAT.

Vamos prosseguir explicando a montagem da tabela utilizando o seguinte


exemplo:

E = (x1 ∨ ¬x2 ∨ ¬x3) ∧ (¬x1 ∨ ¬x2 ∨ ¬x3) ∧ (¬x1 ∨ ¬x2 ∨ x3)∧ (x1 ∨ x2
∨ x 3)
Redução
- Criamos dois números
inteiros no conjunto S para
cada variável Xi e para
cada cláusula Cj
- Cada número possui n+k
dígitos, sendo n o número
de variáveis e k o número
de cláusulas
Redução
Para cada Xi, definimos Vi e Vi',
que recebem 1.

(Vi, Xi) = 1 indica que Xi = 1

(Vi', Xi) = 1 indica que ~Xi = 1


Redução
Para cada Cj, definimos Si e Si',
que recebem 1 e 2,
respectivamente.

São consideradas variáveis de


folga
Redução
Conforme a expressão:

E = (x1 ∨ ¬x2 ∨ ¬x3) ∧ (¬x1 ∨ ¬x2 ∨


¬x3) ∧ (¬x1 ∨ ¬x2 ∨ x3) ∧ (x1 ∨ x2 ∨ x3)

Preenchemos com 1 os espaços (Vi, Cj)


cujo Xi se faz presente na cláusula
Redução
Definimos a última linha t com 1 nas
colunas Xi e 4 nas colunas Cj

Essa linha configura a soma que


devemos alcançar ao escolher
linhas da tabela para compor a
solução (note a semelhança que
surge com a soma de
subconjuntos)

Se não conseguimos atingir t, a


entrada é rejeitada
Redução
Soma de Subconjuntos:

Encontramos o conjunto S = {1001001,


1000110, 100001, 101110, 10011,
11100, 1000, 2000, 100, 200, 10, 20, 1,
2}

E t = 1114444
Redução
Soma de Subconjuntos:

Escolhemos as linhas cuja soma dos


dígitos em cada coluna corresponde aos
dígitos de t.

1000110 + 101110 + 10011 + 1000 +


2000 + 200 + 10 + 1 + 2 = 1114444

X1 = 0
X2 = 0
X3 = 1
Código e Complexidade
Código e Complexidade
Complexidade
T(n, k) = 4n^2 + 8nk + 4k^2 + 10k + 4n + 7

O(y^2), para y = max(n, k)

→ Logo, a redução acontece em tempo polinomial


Conclusão
Como foi possível reduzir o problema do 3-SAT para a soma de subconjuntos em
tempo polinomial, provamos que a soma de subconjuntos pertence a classe
NP-Difícil.

Como a soma de subconjuntos pertence às classes NP-Difícil e NP, então


pertence a NP-Completo.
Dúvidas?

Você também pode gostar