Jawaban Aryabhata dapat diperbaiki dengan memanfaatkan fakta bahwa kita dapat mengalikan semua angka dengan beberapa c besar , dan kemudian menambahkan sesuatu yang kecil ke masing-masing untuk bertindak seperti "tag kehadiran", dan kemudian menyediakan beberapa nomor tambahan yang akan memungkinkan kita untuk sampai ke nol jika kita bisa mendapatkan c K tanpa mereka. Secara khusus, kita akan menggunakan c = 2 ( n + 1 ) dan 1 sebagai tag keberadaan.
Diberikan instance ( S= { x1, ... , xn} , K) dari masalah umum dengan nilai target K , kami akan membuat instance dari masalah spesifik (dengan nilai target 0) yang berisi:
- Y= { y1, ... , yn} , di manaysaya= 2 ( n + 1 ) xsaya+ 1 .
- Angka z= - 2 K( N + 1 ) - n .
- n - 1 salinan dari angka 1, untuk disebut sebagai angka "pull-up".
Saya akan menganggap sebagai Aryabhatta melakukan itu K positif. (Karena sudah 6 tahun, saya akan menjawab latihannya untuk pembaca: alasan kita bisa melakukan ini adalah bahwa jika kita menukar tanda-tanda semua angka dalam contoh masalah umum, termasuk K , maka kita berakhir dengan contoh masalah baru yang setara. Itu berarti bahwa algoritma untuk menyelesaikan instance positif K cukup untuk menyelesaikan masalah apa pun - untuk memecahkan contoh dengan negatif K , kita bisa melakukan sign-swap ini, menjalankan algoritma itu, dan meneruskan jawabannya sebagai jawaban untuk pertanyaan awal dan tentu saja jika K= 0 maka kita tidak perlu melakukan transformasi apapun dari kasus umum menjadi kasus khusus sama sekali!)
Pertama-tama mari kita tunjukkan bahwa jawaban YA untuk contoh yang diberikan dari masalah umum menyiratkan jawaban YA untuk contoh yang dibuat dari masalah khusus. Di sini kita bisa berasumsi bahwa beberapa solusi { xj1, ... , xjm} untuk masalah umum ada: yaitu, koleksi tak kosong ini m nomor jumlah untuk K . Jadi jika kita mengambil yang sesuai y -values {yj1,…,yjm} ke solusi kami untuk contoh dibangun, mereka akan berjumlah 2K(n+1)+m . Kita kemudian dapat memilih untuk memasukkan−2K(n+1)−n dalam solusi, meninggalkan kita dengan jumlahm−n . Karena1≤m≤n , ini dalam kisaran[−n+1,0] , yang dapat berhasil kita tarik hingga 0 dengan memasukkan beberapa bagian dari angka pull-up.
Sekarang mari kita tunjukkan bahwa jawaban YA untuk instance yang dibangun menyiratkan jawaban YA untuk instance yang diberikan asli. Di sinilah perkalian dengan 2(n+1) menjadi penting - inilah yang memungkinkan kita untuk memastikan bahwa angka tambahan yang kita masukkan tidak dapat "melakukan terlalu banyak".
Di sini kita dapat mengasumsikan bahwa beberapa solusi {yj′1,…,yj′m′} ada pada contoh yang dibangun: yaitu, kumpulan angka m′ kosong ini berjumlah 0. Dengan persyaratan masalah, solusi ini berisi di setidaknya satu elemen. Lebih lanjut, itu harus mengandung setidaknya satu elemen dari Y , karena tanpa ini tidak mungkin mencapai total 0: Jika hanya angka pull-up yang ada, maka jumlah tersebut harus dalam kisaran [1,n−1] ( perhatikan bahwa dalam hal ini setidaknya satunomor pull-up harus ada, dan semuanya benar-benar positif, jadi jumlahnya tidak boleh 0); sedangkan jika solusinya hanya terdiri dari z dan beberapa angka pull-up, maka totalnya tentu negatif karena z=−2K(n+1)−n≤−n dan paling banyak angka pull-up dapat meningkatkan jumlah oleh adalah n−1 .
Sekarang anggaplah terhadap kontradiksi bahwa solusi tidak mengandung z . Setiap elemen di Y terdiri dari dua hal: Sebuah kelipatan 2(n+1) , dan "tag kehadiran" +1. Perhatikan bahwa 1 jangka pada masing-masing n unsur Y meningkatkan jumlah dengan 1 jika elemen yang dipilih, seperti halnya masing-masing hingga n−1 nomor pull-up yang dipilih, sehingga total disumbangkan oleh 2 ini sumber untuk solusi apa pun setidaknya 1 (karena kami menetapkan dalam paragraf sebelumnya bahwa setidaknya satu elemen Y harus dipilih) dan paling banyak n+n−1=2n−1 . Secara khusus, ini berarti bahwa jumlah dua set istilah,ketika diambil modulo2(n+1) , adalah nol. Berdasarkan asumsi bahwa solusi tidak mengandungz , komponen hanya lain dalam jumlah ini adalah kelipatan2(n+1) disumbangkan oleh para anggota yang dipilih dariY , yang tidak mempengaruhi nilai sum ketika diambil modulo2(n+1) . Demikian jumlah dari semua istilah dalam solusi, ketika diambil modulo2(n+1) , adalah nol, yang berarti tidak dapat sama dengan jumlah target 0, yang berarti tidak dapat menjadi solusi yang valid sama sekali: kami telah menemukan kontradiksi, yang berarti bahwa hal itu harus bahwaz=−2K(n+1)−n hadir dalam setiap solusi setelah semua.
Jadi setiap solusi mengandung z . Kami tahu itu
(−2K(n+1)−n)+∑m′i′=1(2(n+1)xj′i′+1)+∑pull-ups=0 ,
dan kami dapat mengatur ulang persyaratan:
−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
Ini bisa langsung diganti kembali ke persamaan sebelumnya untuk mendapatkan
2(n+1)(−K+∑m′i′=1xj′i′)=0
2(n+1)
−K+∑m′i′=1xj′i′=0
yang menghasilkan solusi untuk contoh masalah umum asli.