The problem can be solved in pseudo-polynomial time using dynamic programming. Suppose the sequence is
x1, ..., xN
and we wish to determine if there is a nonempty subset which sums to zero. Define the boolean-valued function Q(i, s) to be the value (true or false) of
"there is a nonempty subset of x1, ..., xi which sums to s".
Thus, the solution to the problem "Given a set of integers, is there a non-empty subset whose sum is zero?" is the value of Q(N, 0).
Let A be the sum of the negative values and B the sum of the positive values. Clearly, Q(i, s) = false, if s < A or s > B. So these values do not need to be stored or computed.
Create an array to hold the values Q(i, s) for 1 ≤ i ≤ N and A ≤ s ≤ B.
The array can now be filled in using a simple recursion. Initially, for A ≤ s ≤ B, set
Q(1, s) := (x1 == s)
where == is a boolean function that returns true if x1 is equal to s, false otherwise.
Then, for i = 2, …, N, set
Q(i, s) := Q(i − 1, s) or (xi == s) or Q(i − 1, s − xi), for A ≤ s ≤ B.
For each assignment, the values of Q on the right side are already known, either because they were stored in the table for the previous value of i or because Q(i − 1,s − xi) = false if s − xi < A or s − xi > B. Therefore, the total number of arithmetic operations is O(N(B − A)). For example, if all the values are O(Nk) for some k, then the time required is O(Nk+2).
This algorithm is easily modified to return the subset with sum 0 if there is one.
The dynamic programming solution has runtime of O(sN) where s in the sum we want to find in set of N numbers. This solution does not count as polynomial time in complexity theory because B − A is not polynomial in the size of the problem, which is the number of bits used to represent it. This algorithm is polynomial in the values of A and B, which are exponential in their numbers of bits.
For the case that each xi is positive and bounded by a fixed constant C, Pisinger found a linear time algorithm having time complexity O(NC) (note that this is for the version of the problem where the target sum is not necessarily zero, otherwise the problem would be trivial).[3] In 2015, Koiliaris and Xu found the ilde{O}(s sqrt N) algorithm for the subset sum problem where s is the sum we need to find.[4]
ปัญหานี้สามารถแก้ไขได้ในเวลาพหุนาม pseudo-ที่ใช้การเขียนโปรแกรมแบบไดนามิก สมมติว่าเป็นลำดับx1,..., xNและเราต้องดูว่า มีชุดย่อย nonempty ซึ่งผลรวมเป็นศูนย์ กำหนดฟังก์ชันบูลีนมูลค่า Q (i, s) เป็น ค่า (true หรือ false)"ได้ย่อย nonempty x 1,..., สิซึ่งผลรวมไปยัง s"ดังนั้น การแก้ไขปัญหา "ให้ชุดของจำนวนเต็ม มีย่อยไม่ว่างซึ่งค่าผลรวมเป็นศูนย์หรือไม่" คือค่าของ Q (N, 0)ให้ A เป็นผลรวมของค่าบวกผลรวมของค่าลบและ B ชัดเจน Q (i, s) = false ถ้า s < A หรือ s > บี ดังนั้น ค่าเหล่านี้ไม่จำเป็นต้องจัดเก็บ หรือคำนวณสร้างอาร์เรย์เก็บค่าของ Q (i, s) 1 ≤ฉัน≤ N และ A ≤ s ≤ B.อาร์เรย์นี้สามารถเติมใช้สอบง่าย สำหรับการ≤ s ≤ B ตั้งค่าเริ่มต้นQ (1, s): = (x 1 == s)ที่==คือฟังก์ชันบูลีที่คืนค่าจริงถ้า x 1 เท่ากับ s เท็จมิฉะนั้นแล้ว หา = 2,..., N ตั้งQ (i, s): = Q (ฉัน− 1, s) หรือ (ซี== s) หรือ Q (ฉัน− 1 − s ในซีอานซีกวน), สำหรับการ≤≤ s เกิดสำหรับแต่ละการกำหนด ค่าของ Q ด้านขวาแล้วทราบว่า เนื่อง จากพวกเขาถูกเก็บไว้ในตารางเป็นค่าก่อนหน้าของฉัน หรือเพราะ Q (ฉัน− 1,s − xi) = false ถ้า s − xi < A หรือ s − xi > B. ดังนั้น จำนวนรวมของการดำเนินการทางคณิตศาสตร์เป็น O (N (B − A)) ตัวอย่าง กรณีที่ค่าทั้งหมดเป็น O(Nk) สำหรับ k บาง แล้วเวลาที่ใช้ได้ O(Nk+2)ได้มีการปรับเปลี่ยนอัลกอริทึมนี้กลับชุดย่อย มีการรวม 0 ถ้ามีการแก้ปัญหาการเขียนโปรแกรมแบบไดนามิกมีรันไทม์ของ O(sN) ซึ่งในผลรวมที่เราต้องการค้นหาชุดของตัวเลข N วิธีนี้ไม่นับรวมเป็นเวลาโพลิโนเมียในทฤษฎีความซับซ้อนเนื่องจาก B − A เป็นพหุนามในขนาดของปัญหา ซึ่งเป็นจำนวนของบิตที่ใช้แทนมัน ไม่ อัลกอริทึมนี้เป็นพหุนามในค่าของ A และ B ที่เนนในจำนวนของบิตสำหรับกรณีว่าสิละกี่ โดย C เป็นค่าคงที่ถาวร และบวก Pisinger พบอัลกอริทึมเวลาเชิงเส้นมีความซับซ้อนเวลา O(NC) (หมายเหตุว่า เป็นรุ่นของปัญหาซึ่งผลรวมเป้าหมายไม่จำเป็นต้องเป็นศูนย์ มิฉะนั้นปัญหาจะเล็กน้อย) [3] ใน 2015, Koiliaris และเขาพบอัลกอริทึม ilde{O}(s sqrt N) ปัญหาผลรวมย่อยโดยที่ s คือผลรวมที่เราต้องการค้นหา [4]
การแปล กรุณารอสักครู่..

ปัญหาที่เกิดขึ้นสามารถแก้ไขได้ในเวลาหลอกพหุนามโดยใช้โปรแกรมแบบไดนามิก สมมติว่าเป็นลำดับx1, ... , xN และเราต้องการที่จะตรวจสอบว่ามีเซตว่างซึ่งผลรวมเป็นศูนย์ กำหนดฟังก์ชั่นบูลมูลค่าคิว (i, s) เพื่อเป็นค่า (จริงหรือเท็จ) ของ"มีความเป็นเซตว่างของ x1, ... , ซีอานซึ่งจะสรุปของ". ดังนั้นวิธีการแก้ปัญหาที่เกิดขึ้น " รับชุดของจำนวนเต็มจะมีส่วนย่อยที่ไม่ว่างเปล่าที่มีผลรวมเป็นศูนย์? " คือค่าของ Q (N, 0). ให้ A เป็นผลรวมของค่าลบและ B ผลรวมของค่าบวก เห็นได้ชัดว่า Q (i, s) = เท็จถ้า s <A หรือของ> บีดังนั้นค่าเหล่านี้ไม่จำเป็นต้องได้รับการจัดเก็บหรือคำนวณ. สร้างอาร์เรย์เพื่อเก็บค่า Q (i, s) 1 ≤≤ฉัน ยังไม่มีและ A ≤≤ s บีอาเรย์ที่ตอนนี้สามารถเติมเต็มในการใช้การเรียกซ้ำง่าย ในขั้นต้นของ A ≤≤ s B ตั้งQ (1, s) = (x1 == s) ที่ == เป็นฟังก์ชั่นบูลที่ส่งกลับจริงถ้า x1 เท่ากับ s เท็จอย่างอื่น. แล้วสำหรับ i = 2 , ... , N, ตั้งQ (i, s) = Q (i - 1, S) หรือ (ซีอาน == s) หรือ Q (i - 1, s - จิน) ของ A ≤≤ s บีสำหรับแต่ละการกำหนดค่าของ Q ทางด้านขวาเป็นที่รู้จักกันอยู่แล้วเช่นกันเพราะพวกเขาจะถูกเก็บไว้ในตารางสำหรับค่าก่อนหน้าของฉันหรือเพราะ Q (i - 1, s - จิน) = เท็จถ้า s - จิน <A หรือ s - จิน> บีดังนั้นจำนวนรวมของการดำเนินการทางคณิตศาสตร์ O (N (B - A)) ตัวอย่างเช่นถ้าค่าทั้งหมดเป็น O (Nk) สำหรับ k บางส่วนแล้วเวลาที่ต้องเป็น O (Nk + 2). ขั้นตอนวิธีนี้จะแก้ไขได้อย่างง่ายดายที่จะกลับย่อยที่มีผลรวม 0 ถ้ามีหนึ่ง. การแก้ปัญหาการเขียนโปรแกรมแบบไดนามิกที่มี รันไทม์ของ O (SN) ซึ่งในจำนวนเงินที่เราต้องการที่จะพบในชุดของตัวเลขยังไม่มี การแก้ปัญหานี้ไม่ได้นับเวลาพหุนามในขณะที่ทฤษฎีความซับซ้อนเพราะ B - จะไม่พหุนามในขนาดของปัญหาซึ่งเป็นจำนวนบิตที่ใช้ในการเป็นตัวแทน ขั้นตอนวิธีนี้เป็นพหุนามในค่าของ A และ B ซึ่งเป็นชี้แจงในตัวเลขของพวกเขาบิต. สำหรับกรณีที่แต่ละซีอานเป็นบวกและล้อมรอบด้วยคง C คง Pisinger พบอัลกอริทึมเส้นเวลามีเวลาซับซ้อน O (NC) (ทราบว่านี้เป็นรุ่นของปัญหาที่ผลรวมเป้าหมายไม่จำเป็นต้องเป็นศูนย์มิฉะนั้นปัญหาจะเป็นที่น่ารำคาญ). [3] ในปี 2015 Koiliaris และเสี่ยวพบ หนอน {O} (s sqrt N) อัลกอริทึมสำหรับปัญหาผลรวมย่อยที่ s คือผลรวมที่เราต้องไปหา. [4]
การแปล กรุณารอสักครู่..

ปัญหาที่สามารถแก้ไขได้ในเวลาพหุนามเทียมโดยใช้โปรแกรมแบบไดนามิก สมมติว่าลำดับเป็น
x1 , . . . , คริสเตียน
และเราต้องการตรวจสอบว่ามีเซตย่อยที่ผลรวมเป็นศูนย์ กำหนดบูลีนฟังก์ชันค่า Q ( , S ) จะเป็นค่า ( จริงหรือเท็จ )
" มีเซตย่อยของ x1 , . . . , Xi ซึ่งผลรวม s "
ดังนั้นทางแก้ปัญหา " ได้รับชุดของจำนวนเต็มมีไม่ว่างย่อยที่มีผลรวมเป็นศูนย์ ? คือค่า Q ( , 0 )
ให้ถูกผลรวมของค่าลบ และ บี ผลรวมของค่าเป็นบวก ชัดเจน , Q ( , s ) = false ถ้า S < s > b หรือ ดังนั้น ค่าเหล่านี้ไม่ต้องเก็บไว้ หรือคำนวณ
สร้าง array เก็บค่า Q ( , S ) 1 ≤ผม≤ N และ≤ S ≤ B .
อาร์เรย์สามารถตอนนี้ เต็มในการใช้วิการเรียกซ้ำ ในตอนแรกสำหรับ≤ S ≤ B ชุด
Q ( , S ) : = ( x1 = =
= = ) ซึ่งเป็นฟังก์ชันที่ส่งกลับบูลีนเป็นจริงถ้า x1 เท่ากับเป็นเท็จ มิฉะนั้น
แล้วฉัน = 2 , . . . , n , ชุด
Q ( ฉัน , s ) = Q ( − 1 ) ( หรือ ซี = = S ) Q ( − 1 , − 11 ) สำหรับ≤ S ≤ B .
สำหรับแต่ละงาน ค่า Q บนด้านขวาจะรู้จักกันอยู่แล้วเพราะพวกเขาถูกเก็บไว้ในโต๊ะสำหรับค่าก่อนหน้าของฉัน หรือเพราะเรื่อง Q ( − 1 , − 11 ) = false ถ้า s หรือ s −− 11 < 11 > B . ดังนั้นจำนวนของการดำเนินการเลขคณิตคือ O ( N ( A − ) ) ตัวอย่างเช่นถ้าค่าทั้งหมดเป็น O ( NK ) บาง เค แล้วเวลาเป็น O ( nk 2 )
วิธีนี้จะแก้ไขได้อย่างง่ายดายคืนบางส่วนที่มีผลรวม 0 ถ้ามี
แก้ปัญหาโปรแกรมพลวัตมีรันไทม์ของ O ( SN ) ซึ่งในผลรวมที่เราต้องการหาในชุดของตัวเลข โซลูชั่นนี้ไม่นับเป็นพหุนามในทฤษฎีความซับซ้อนเพราะ B −ไม่ได้เป็นพหุนามกับขนาดของปัญหา ซึ่งเป็นจำนวนของบิตที่ใช้แสดงมัน ขั้นตอนวิธีนี้เป็นพหุนามในค่าของ A และ B ซึ่งจะอธิบายในตัวเลขของบิต .
สำหรับกรณีที่แต่ละ Xi เป็นบวก และล้อมรอบด้วยการแก้ไขค่าคงที่ C pisinger พบเส้นขั้นตอนวิธีที่มีความซับซ้อนเวลาเวลา O ( NC ) ( หมายเหตุนี้เป็นรุ่นของปัญหาที่ผลรวมเป้าหมายไม่จําเป็นต้องศูนย์มิฉะนั้นปัญหาจะเล็กน้อย ) [ 3 ] ในปี 2558และพบ koiliaris ซู N ทิลเดอ { O } ( S / SQRT n ) ขั้นตอนวิธีการหาค่าผลรวมย่อยที่เป็นปัญหารวมเราต้องพบ [ 4 ]
การแปล กรุณารอสักครู่..
