Jumlah Subset: kurangi khusus ke kasus umum

20

Wikipedia menyatakan masalah jumlah subset sebagai menemukan subset dari multiset integer yang diberikan, yang jumlahnya adalah nol. Lebih lanjut ia menyatakan bahwa itu sama dengan menemukan subset dengan jumlah untuk setiap diberikan .ss

Jadi saya percaya karena keduanya setara, harus ada pengurangan di kedua sisi. Yang dari ke nol adalah sepele dengan mengatur . Tapi saya tidak beruntung menemukan pengurangan dari nol ke , yaitu diberi satu set bilangan bulat , membangun satu set bilangan bulat berisi subset dengan jumlah (untuk sembarang ), jika dan hanya jika ada sebagai himpunan bagian dari dengan jumlah nol.ss=0sABssA

Bisakah Anda memberi saya beberapa petunjuk?

ipsec
sumber

Jawaban:

11

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 } .xi>0S={x1,x2,,xn,K}

memiliki subset sum 0 IFF S memiliki subset dari jumlah K .S0SK

Masalahnya terjadi ketika kita dapat memiliki untuk beberapa i .xi0i

Kita dapat mengasumsikan bahwa (mengapa?).K>0

Misalkan jumlah dari positif adalah P dan negatif x i adalah N .xiPxiN

Sekarang buat himpunan baru sedemikian rupaS={y1,y2,yn}

mana M = P + | N | + K .yi=xi+MM=P+|N|+K

Setiap .yi>0

Sekarang jalankan algoritma zero-subset-sum pada set

S{(K+M)}

S{(K+2M)}

S{(K+3M)}

S{(K+nM)}

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.

Aryabhata
sumber
Terima kasih banyak. Saya bertanya-tanya, apakah ada pengurangan yang mengubah instance dari 0-subset-sum menjadi satu (bukannya ) contoh K-subset-sum? n
ipsec
@ipsec: Maksud Anda mengubah instance K-subset-sum menjadi 0-subset-sum? Mungkin mengambil persatuan set di atas akan berhasil. n
Aryabhata
Yah, saya sebenarnya berpikir dua kali apakah saya mendapatkan arah yang kuat sekarang. Ketika saya ingin menunjukkan bahwa K-subset-jumlah adalah NP-keras untuk setiap K mengingat fakta, bahwa 0-subset-jumlah adalah NP-keras, saya dapat menggunakan pengurangan dari 0-subset-jumlah ke K-subset-jumlah , yang saya perlukan transformasi poli-waktu dari 0-instance ke-K-instance. Tetapi sekarang saya tidak yakin apakah ini yang sebenarnya saya tanyakan dalam pertanyaan saya.
ipsec
@ipsec: Ketika Anda mengatakan set , Anda telah menunjukkan NP-Hardness of K -subset-sum mengingat NP-Hardness dari zero-subset-sum: masalah umum setidaknya sama sulitnya dengan masalah khusus. Perhatikan bahwa dalam istilah reduksi, Anda mengatakan Anda telah mengurangi zero-subset-sum menjadi K -subset-sum. Juga, perhatikan bahwa K adalah input . Ketika Anda berbicara tentang "setiap diberikan K " apa sebenarnya yang Anda maksud? Jawaban di atas menunjukkan bahwa kasus khusus (zero-subset-sum) sama sulitnya (dalam arti NP-hardness) seperti kasus umum ( k -subset-sum, di mana k adalah input). s=0KKKKkk
Aryabhata
Lupakan. Yang awalnya saya ingin tahu adalah, jika kita tahu bahwa 0-subset-sum adalah NP-hard, dapatkah kita menurunkannya, misalnya 1-subset-sum juga? Wikipedia mengatakannya, tetapi saya sedang mencari pengurangan yang tepat. Namun saya melihat sekarang bahwa kata-kata saya benar-benar kacau dan saya sebenarnya bertanya sebaliknya. Pokoknya Anda memberi saya cukup input untuk mengurangi dari instance K-subset-sum ke instance L-subset-sum untuk setiap bilangan bulat K dan L yang diberikan, jadi masalah saya masih terpecahkan.
ipsec
0

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 cK 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 manayi=2(n+1)xi+1 .
  • Angka z=2K(n+1)n .
  • n1 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 memasukkan2K(n+1)n dalam solusi, meninggalkan kita dengan jumlahmn . Karena1mn , 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 {yj1,,yjm} 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,n1] ( 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)nn dan paling banyak angka pull-up dapat meningkatkan jumlah oleh adalah n1 .

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 n1 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+n1=2n1 . 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)+i=1m(2(n+1)xji+1)+pull-ups=0 ,

dan kami dapat mengatur ulang persyaratan:

2K(n+1)+i=1m(2(n+1)xji)(n+i=1m1+pull-ups)=0

2K(n+1)+i=1m(2(n+1)xji)(n+m+pull-ups)=0

2(n+1)(K+i=1mxji)(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+i=1mxji)=0

2(n+1)

K+i=1mxji=0

yang menghasilkan solusi untuk contoh masalah umum asli.

j_random_hacker
sumber