A resposta de Aryabhata pode ser corrigida usando o fato de que podemos multiplicar todos os números por um c 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:
- Y={y1,…,yn} , ondeyi=2(n+1)xi+1 .
- O número z=−2K(n+1)−n .
- n−1 cópias do número 1, a serem chamadas de números "pull-up".
Suponho que Aryabhatta faça que K 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 por 2(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 .
zY2(n+1)nYn−1Yn+n−1=2n−12(n+1)z2(n+1)Y2(n+1)2(n+1)z=−2K(n+1)−n
z
(−2K(n+1)−n)+∑m′i′=1(2(n+1)xj′i′+1)+∑pull-ups=0
e podemos reorganizar os termos:
−2K(n+1)+∑m′i′=1(2(n+1)xj′i′)−(n+∑m′i′=11+∑pull-ups)=0
−2K(n+1)+∑m′i′=1(2(n+1)xj′i′)−(n+m′+∑pull-ups)=0
2(n+1)(−K+∑m′i′=1xj′i′)−(n+m′+∑pull-ups)=0
2(n+1)2(n+1)
−(n+m′+∑pull-ups)=0
Isso pode ser substituído diretamente na equação anterior para obter
2(n+1)(−K+∑m′i′=1xj′i′)=0
2(n+1)
−K+∑m′i′=1xj′i′=0
que produz uma solução para a instância original do problema geral.