นี่เป็นคำตอบเพิ่มเติมว่าเหตุใดผลรวมที่ไม่ซ้ำใครจึงส่งผลต่อขนาดอย่างมาก $52485332$ กลายเป็นเรื่องเล็กน้อย (เป็นวิธีที่จะใช้เวลานานสำหรับความคิดเห็น)
เมื่อผลรวมทั้งหมดต้องไม่ซ้ำกัน ผลรวมทั้งหมดจึงต้องเป็นจำนวนเต็มที่แตกต่างกัน
เพราะมี $500^{1000}$ ผลรวมที่เป็นไปได้นอกจากนี้ยังมี $500^{1000}$ ผลลัพธ์จำนวนเต็มที่แตกต่างกันสำหรับสิ่งนั้น กรณีต่ำสุดจะเป็นจำนวนเต็มทั้งหมดจาก $0$ ถึง $500^{1000}-1$.
ตัวอย่างเช่น,
$S_1 = \{0, 1, 2, ..., 499\}$
$S_2 = \{0, 500, 1,000, ..., 249500\}$
$S_3 = \{0, 250000, 500000, ..., 124750000\}$
...
$S_{1000} = \{0, 500^{999}, 2*500^{999}, ..., 499*500^{999}\}$
จะเป็นวิธีที่รับประกันความเป็นเอกลักษณ์ของผลลัพธ์ อย่างที่คุณเห็น ตัวเลขเพิ่มขึ้นเร็วมากจริงๆ
ในตัวอย่างนี้ ง่ายต่อการค้นหาผลลัพธ์ (เพียงเลือกจำนวนที่มากที่สุดที่พอดีจากชุดสุดท้ายถึงชุดแรกเสมอ) แม้แต่ตัวเลขส่วนใหญ่ก็คือ $S_3$ มีค่ามากกว่า $52485332$ ดังนั้นจึงสามารถละเว้นได้
คุณอาจต้องการค่าที่ค่อนข้างสุ่มในชุดของคุณ ในกรณีนี้ ช่วงของค่าต้องมากกว่าเล็กน้อยเป็นอย่างน้อย
อย่างไรก็ตาม ไม่น่าเป็นไปได้อย่างยิ่งที่ค่าใดๆ จะต่ำกว่าหรือเท่ากับ $52485332$ (เมื่อคุณเลือกแบบเดียวกัน $500000$ ค่าออกจาก $500^{1000}$)
การเขียนโปรแกรมแบบไดนามิกตามที่ @poncho แนะนำนั้นใช้งานได้กับจำนวนน้อยเท่านั้น และประสิทธิภาพของมันก็ไม่ได้ดีไปกว่าการค้นหาแบบละเอียดถี่ถ้วน (ความแตกต่างเชิงเส้นในจำนวนชุด) เนื่องจากผลรวมย่อยที่สามารถนำมาใช้ซ้ำได้นั้นไม่ซ้ำกัน ข้อได้เปรียบ การไม่ดูความเป็นไปได้อย่างอื่นก็ไม่มี
รันไทม์ควรเป็นลำดับเดียวกับการค้นหาแบบละเอียด การปรับปรุงเพียงอย่างเดียวคือต้องดำเนินการเมื่อค่ามีขนาดใหญ่หรือเล็กเพื่อบรรลุเป้าหมาย แต่สำหรับเป้าหมายที่สมเหตุสมผลนั้นไม่มีข้อได้เปรียบมากนัก
On สามารถลดปัญหาผลรวมย่อยหรือปัญหาเป้ได้อย่างง่ายดายเพียงแค่ใช้ชุดเดียวกันหลาย ๆ ครั้งตามจำนวนที่คุณต้องการรวมปัญหาของสิ่งนี้คือนี่ไม่ใช่มดลดเวลาพหุนาม ดังนั้นจึงไม่เพียงพอที่จะพิสูจน์ว่าปัญหาคือ NP ยากหรือไม่