Você já tem uma redução de especial para geral. Ao definir , você basicamente usa o algoritmo geral para resolver o problema especial.s = 0
Para o contrário (ou seja, uma redução de geral para especial):
Suponha que você está dado um conjunto e um número e você tem que determinar se existe algum subconjunto de que resume a .S= { x1, … , Xn}KSK
Agora você deseja resolver esse problema, considerando um algoritmo para o caso em que é possível determinar se algum subconjunto é igual a .0 0
Agora, se , temos uma redução fácil: .xEu> 0S′= { x1, x2, … , Xn, - K}
S′ tem um subconjunto de soma sse tem um subconjunto de soma .0 0SK
O problema ocorre quando podemos ter para alguns dos .xEu≤ 0Eu
Podemos assumir que (por quê?).K> 0
Suponhamos que a soma do positivo é e o negativo é . P x i NxEuPxEuN
Agora construa um novo conjunto tal queS′= { y1, y2... , yn}
M = P + | N | + KyEu= xEu+ M que .M= P+ | N| +K
Cada .yEu> 0
Agora execute o algoritmo de soma de subconjunto zero nos conjuntos
S′∪ { - ( K+ M) }
S′∪{−(K+2M)}
S′∪{−(K+3M)}
…
S′∪{−(K+nM)}
É fácil mostrar que, se tem um subconjunto da soma , pelo menos um dos conjuntos acima tem subconjunto da soma zero.KSK
Deixarei a prova da outra direção para você.
A resposta de Aryabhata pode ser corrigida usando o fato de que podemos multiplicar todos os números por umc grande e, em seguida, adicionar algo pequeno a cada um para agir como uma "etiqueta de presença" e fornecer alguns números extras que permitirão nós para chegar a zero, se pudéssemos chegar a cK sem eles. Especificamente, usaremos c=2(n+1) e 1 como tag de presença.
Dada uma instância(S={x1,…,xn},K) do problema geral com o valor alvo K , criaremos uma instância do problema específico (com valor alvo 0) que contém:
Suponho que Aryabhatta faça queK seja positivo. (Já faz seis anos, responderei seu exercício para o leitor: a razão pela qual podemos fazer isso é que, se trocarmos os sinais de todos os números em uma instância do problema geral, incluindo K , terminamos com um nova instância de problema equivalente.Isso significa que um algoritmo para resolver instâncias K positivas é suficiente para resolver qualquer problema - para resolver uma instância com K negativo , poderíamos executar essa troca de sinal, executar esse algoritmo e encaminhar sua resposta da seguinte forma: a resposta para a pergunta original e, é claro, se K=0 então não precisamos realizar nenhuma transformação do caso geral no caso especial!)
Primeiro, vamos mostrar que uma resposta SIM à instância dada do problema geral implica uma resposta SIM à instância construída do problema especial. Aqui podemos supor que alguma solução{xj1,…,xjm} para o problema geral existe, ou seja, esta coleção não vazio de m números somas para K . Assim, se tomarmos as correspondentes y -Valores {yj1,…,yjm} na nossa soluo para o exemplo construídas, irão sintetizar a 2K(n+1)+m . Podemos então optar por incluir−2K(n+1)−n na solução, deixando-nos com uma soma dem−n . Desde1≤m≤n , isso está no intervalo[−n+1,0] , que podemos obter com sucesso até 0, incluindo alguns subconjuntos dos números de pull-up.
Agora vamos mostrar que uma resposta SIM à instância construída implica uma resposta SIM à instância original fornecida. É aqui que a multiplicação por2(n+1) se torna importante - é o que nos permite ter certeza de que os números extras que incluímos não podem "fazer muito".
Aqui, podemos assumir que existe alguma solução{yj′1,…,yj′m′} para a instância construída: ou seja, essa coleção não vazia de m′ números é igual a 0. Pelos requisitos do problema, esta solução contém em pelo menos um elemento. Além disso, ele deve conter pelo menos um elemento de Y , pois sem isso é impossível atingir um total de 0: se apenas números de pull-up estiverem presentes, a soma estará necessariamente no intervalo [1,n−1] ( note que, neste caso, pelo menos umo número de pull-up deve estar presente e todos eles são estritamente positivos; portanto, a soma não pode ser 0); enquanto que se a solução consistir em apenas z e alguns números de pull-up, o total será necessariamente negativo porque z=−2K(n+1)−n≤−n e o máximo que os números de pull-up puderem aumentar a soma por é n−1 .
e podemos reorganizar os termos:
Isso pode ser substituído diretamente na equação anterior para obter
que produz uma solução para a instância original do problema geral.
fonte