ผลรวมย่อย: ลดพิเศษกรณีทั่วไป


20

วิกิพีเดียระบุปัญหาผลรวมเซตย่อยตามการค้นหาเซ็ตย่อยของชุดเลขจำนวนเต็มที่กำหนดซึ่งผลรวมเป็นศูนย์ นอกจากนี้มันกล่าวว่ามันจะเทียบเท่ากับการหาชุดย่อยที่มีผลรวมสำหรับการใด ๆ ให้sss

ดังนั้นฉันเชื่อว่ามันเท่ากันต้องลดทั้งสองข้าง หนึ่งจากไปที่ศูนย์เป็นเล็กน้อยโดยการตั้งค่า0 แต่ฉันไม่มีโชคในการหาการลดลงจากศูนย์ถึงเช่นได้รับชุดจำนวนเต็มสร้างชุดจำนวนเต็มที่ประกอบด้วยชุดย่อยที่มีผลรวม (สำหรับใด ๆ) ถ้าหากมีเซตย่อยของด้วยเท่านั้น ผลรวมศูนย์ss=0sABssA

คุณช่วยชี้ให้ฉันได้ไหม

คำตอบ:


11

จริง ๆ แล้วคุณมีการลดจากพิเศษเป็นทั่วไป โดยการตั้งค่าคุณจะใช้อัลกอริทึมทั่วไปเพื่อแก้ปัญหาพิเศษs=0

สำหรับรอบทางอื่น ๆ (เช่นการลดลงจากทั่วไปเป็นพิเศษ):

สมมติว่าคุณจะได้รับชุดและจำนวนและคุณจะต้องตรวจสอบว่ามีส่วนย่อยบางส่วนของซึ่งจำนวนเงินที่จะKK S KS={x1,…,xn}KSK

ตอนนี้คุณต้องการที่จะแก้ปัญหานี้ได้รับการอัลกอริทึมสำหรับกรณีที่คุณสามารถตรวจสอบว่าเงินก้อนเซตบางอย่างเพื่อ00

ตอนนี้ถ้าเรามีการลดง่าย:\}S ′ = { x 1 , x 2 , … , x n , - K }xi>0S′={x1,x2,…,xn,−K}

S′มีส่วนหนึ่งของจำนวนเงินที่ IFFมีส่วนหนึ่งของจำนวนเงินที่KS K0SK

ปัญหาเกิดขึ้นเมื่อเรามีสำหรับบางตัวixi≤0i

เราสามารถสรุปได้ว่า (เพราะอะไร)K>0

สมมติว่าผลรวมของบวกคือและลบเป็นN P x ฉัน NxiPxiN

ตอนนี้สร้างชุดใหม่นั้นS′={y1,y2…,yn}

M = P + | N | + Kyi=xi+Mโดยที่KM=P+|N|+K

แต่ละ0yi>0

ตอนนี้รันอัลกอริทึม zero-subset-sum บนเซต

S′∪{−(K+M)}

S′∪{−(K+2M)}

S′∪{−(K+3M)}

…

S′∪{−(K+nM)}

มันง่ายที่จะแสดงว่าถ้ามีส่วนย่อยของผลรวมดังนั้นอย่างน้อยหนึ่งชุดข้างต้นมีส่วนย่อยของผลรวมเป็นศูนย์KSK

ฉันจะออกหลักฐานของทิศทางอื่นให้คุณ


ขอบคุณมาก. ฉันสงสัยว่ามีการลดลงซึ่งเปลี่ยนอินสแตนซ์ของ 0-subset-sum เป็นอินสแตนซ์ของ K-subset-sum หนึ่ง (แทน ) หรือไม่? n
— ipsec

@ipsec: คุณหมายถึงแปลงอินสแตนซ์ของ K-subset-sum เป็น 0-subset-sum หรือไม่ บางทีการรวมกลุ่มของเซตด้านบนอาจใช้งานได้ n
— Aryabhata

จริง ๆ แล้วฉันกำลังคิดสองครั้งว่าฉันได้ทิศทางที่ถูกต้องในขณะนี้ เมื่อฉันต้องการแสดงให้เห็นว่า K-subset-sum นั้นเป็น NP-hard สำหรับทุก ๆ K ที่ให้ความจริง, 0-subset-sum นั้นเป็น NP-hard, ฉันสามารถใช้การลดลงจาก 0-subset-sum เป็น K-subset-sum ซึ่งฉันจะต้องแปลงโพลีเวลาจาก 0 ใด ๆ เป็น K-instance แต่ตอนนี้ฉันไม่แน่ใจว่านี่เป็นสิ่งที่ฉันถาม
— ipsec

@ipsec: เมื่อคุณบอกว่า set คุณได้แสดง NP-Hardness ของK -subset-sum ที่ได้รับ NP-Hardness ของ zero-subset-sum: ปัญหาทั่วไปนั้นยากพอ ๆ กับปัญหาพิเศษ โปรดทราบว่าในแง่การลดลงคุณบอกว่าคุณได้ลด zero-subset-sum เป็นK -subset-sum นอกจากนี้ทราบว่าKเป็นอินพุท เมื่อคุณพูดถึง "ทุก ๆK ที่ได้รับ" คุณหมายถึงอะไรกันแน่? คำตอบข้างต้นแสดงให้เห็นว่ากรณีพิเศษ (zero-subset-sum) นั้นยาก (ในแง่ของความแข็งของ NP) เหมือนกับกรณีทั่วไป ( k -subset-sum โดยที่kคืออินพุต) s=0KKKKkk
— Aryabhata

ไม่เป็นไร. สิ่งที่ฉันสงสัยในตอนแรกคือถ้าเรารู้ว่า 0-subset-sum คือ NP-hard เราจะได้มาซึ่งเช่น 1-subset-sum ก็เช่นกัน? Wikipedia พูดอย่างนั้น แต่ฉันกำลังมองหาการลดที่เหมาะสม อย่างไรก็ตามตอนนี้ฉันเห็นว่าถ้อยคำของฉันยุ่งเหยิงไปหมดและฉันก็ถามตรงกันข้าม อย่างไรก็ตามคุณให้ฉันพอที่จะลดจากอินสแตนซ์ K-subset-sum เป็น L-subset-sum เช่นสำหรับจำนวนเต็มใด ๆ K และ L ดังนั้นปัญหาของฉันยังคงถูกแก้ไข
— ipsec

0

คำตอบของ Aryabhataสามารถแก้ไขได้โดยการใช้ความจริงที่ว่าเราสามารถคูณตัวเลขทั้งหมดด้วยcขนาดใหญ่แล้วเพิ่มสิ่งเล็ก ๆ ลงไปในแต่ละอันเพื่อทำหน้าที่เหมือน "แท็กการแสดงตน" จากนั้นใส่ตัวเลขพิเศษบางอย่างที่จะอนุญาต เราจะได้ศูนย์ถ้าเราไปถึงcKโดยไม่มีพวกมัน โดยเฉพาะเราจะใช้c=2(n+1)และ 1 เป็นแท็กการแสดงตน

เนื่องจากอินสแตนซ์(S={x1,…,xn},K)ของปัญหาทั่วไปที่มีค่าเป้าหมายKเราจะสร้างอินสแตนซ์ของปัญหาเฉพาะ (ด้วยค่าเป้าหมาย 0) ที่มี:

  • Y={y1,…,yn}ที่yi=2(n+1)xi+1 1
  • จำนวนz=−2K(n+1)−n n
  • n−1สำเนาของหมายเลข 1 เพื่อเรียกว่าหมายเลข "pull-up"

ฉันจะถือว่า Aryabhatta ทำเช่นนั้นว่าKเป็นบวก (เนื่องจากเป็นเวลา 6 ปีฉันจะตอบแบบฝึกหัดของเขาสำหรับผู้อ่าน: เหตุผลที่เราสามารถทำได้คือถ้าเราสลับเครื่องหมายของตัวเลขทั้งหมดในตัวอย่างของปัญหาทั่วไปรวมถึงKแล้วเราปิดท้ายด้วย ใหม่ปัญหาที่เท่าเทียมกันซึ่งหมายความว่าอัลกอริทึมในการแก้ปัญหาอินสแตนซ์Kเพียงพอสำหรับการแก้ปัญหาใด ๆ - เพื่อแก้ปัญหาด้วยค่าลบKเราสามารถทำการลงชื่อเข้าใช้นี้เรียกใช้อัลกอริธึมนั้น คำตอบสำหรับคำถามเดิมและแน่นอนถ้าK=0 จากนั้นเราไม่จำเป็นต้องทำการเปลี่ยนแปลงใด ๆ ของเคสทั่วไปเป็นเคสพิเศษเลย!)

ก่อนอื่นเราจะแสดงให้เห็นว่าคำตอบของ YES สำหรับปัญหาทั่วไปนั้นหมายถึงคำตอบของ YES สำหรับตัวอย่างพิเศษที่สร้างขึ้นของปัญหาพิเศษ ที่นี่เราสามารถสรุปได้ว่าวิธีการแก้ปัญหาบาง{xj1,…,xjm}เพื่อปัญหาทั่วไปที่มีอยู่นั่นคือคอลเลกชันนี้ว่างของmผลรวมหมายเลขKKดังนั้นถ้าเราใช้เวลาที่สอดคล้องกันy -values {yj1,…,yjm}ในการแก้ปัญหาของเราที่จะสร้างอินสแตนซ์ที่พวกเขาจะรวมไป2K(n+1)+mม. แล้วเราสามารถเลือกที่จะรวม−2K(n+1)−nในการแก้ปัญหาที่ออกจากเราด้วยผลรวมของm−n n ตั้งแต่1≤m≤nสิ่งนี้อยู่ในช่วง[−n+1,0]ซึ่งเราสามารถดึงขึ้นมาเป็น 0 ได้สำเร็จโดยการรวมส่วนย่อยของตัวเลขแบบดึงขึ้น

2(n+1)

{yj1′,…,yjm′′}m′Y[1,n−1]zz=−2K(n+1)−n≤−nn−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)+∑i′=1m′(2(n+1)xji′′+1)+∑pull-ups=0

และเราสามารถจัดเรียงข้อกำหนด:

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

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

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

2(n+1)2(n+1)

−(n+m′+∑pull-ups)=0

สิ่งนี้สามารถทดแทนโดยตรงในสมการก่อนหน้าเพื่อรับ

2(n+1)(−K+∑i′=1m′xji′′)=0

2(n+1)

−K+∑i′=1m′xji′′=0

ซึ่งให้ผลเฉลยกับอินสแตนซ์ปัญหาทั่วไปดั้งเดิม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.