Anda sebenarnya sudah memiliki pengurangan dari khusus ke umum. Dengan mengatur s = 0 , Anda pada dasarnya menggunakan algoritma umum untuk menyelesaikan masalah khusus.
Untuk sebaliknya (yaitu pengurangan dari umum ke khusus):
Misalkan Anda diberi satu set S= { x1, ... , xn} dan sejumlah K dan Anda harus menentukan apakah ada beberapa bagian dari S yang jumlah untuk K .
Sekarang Anda ingin menyelesaikan masalah ini, diberikan algoritme untuk kasus di mana Anda dapat menentukan apakah beberapa subset berjumlah 0 .
Sekarang jika , kami memiliki pengurangan yang mudah: S ′ = { x 1 , x 2 , ... , x n , - K } .xsaya> 0S′= { x1, x2, ... , xn, - K}
memiliki subset sum 0 IFF S memiliki subset dari jumlah K .S′0SK
Masalahnya terjadi ketika kita dapat memiliki untuk beberapa i .xsaya≤ 0saya
Kita dapat mengasumsikan bahwa (mengapa?).K> 0
Misalkan jumlah dari positif adalah P dan negatif x i adalah N .xsayaPxsayaN
Sekarang buat himpunan baru sedemikian rupaS′= { y1, y2... , yn}
mana M = P + | N | + K .ysaya= xsaya+ M.M.= P+ | N| +K
Setiap .ysaya> 0
Sekarang jalankan algoritma zero-subset-sum pada set
S′∪ { - ( K+ M.) }
S′∪ { - ( K+ 2 M.) }
S′∪ { - ( K+ 3 M.) }
...
S′∪ { - ( K+ n M.) }
Mudah untuk menunjukkan bahwa jika memiliki subset dari jumlah K , maka setidaknya satu dari set di atas memiliki subset dari jumlah nol.SK
Saya akan menyerahkan bukti arah lain kepada Anda.
Jawaban Aryabhata dapat diperbaiki dengan memanfaatkan fakta bahwa kita dapat mengalikan semua angka dengan beberapac 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:
Saya akan menganggap sebagai Aryabhatta melakukan ituK 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 dengan2(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 mengandungz . 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 mengandungz . Kami tahu itu
dan kami dapat mengatur ulang persyaratan:
Ini bisa langsung diganti kembali ke persamaan sebelumnya untuk mendapatkan
yang menghasilkan solusi untuk contoh masalah umum asli.
sumber