0Pricing
Coding Interview Prep · บทเรียน

ผลรวมเซตย่อยและการแบ่งส่วน

ทำให้ถึงเป้าหมายด้วยเซตย่อยที่เลือก

ผลรวมเซตย่อยและการแบ่งส่วน เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คำถามเรื่องผลรวมของเซตย่อย

เมื่อกำหนดตัวเลขและเป้าหมายมาให้ มี เซตย่อยใดที่รวมกันได้ตรงกับเป้าหมายพอดีหรือไม่ ปัญหานี้คือปัญหากระเป๋าที่มูลค่าเท่ากับน้ำหนัก

DP แบบบูลีน ไม่ใช่มูลค่า

ในที่นี้คุณติดตามว่าจำนวนเงินใดไปถึงได้ ไม่ใช่ค่าที่มากที่สุด ให้ dp[s] เป็นจริงเมื่อมีเซตย่อยบางชุดรวมกันได้เท่ากับ s พอดี

dp = [False] * (target + 1)
dp[0] = True

ศูนย์ไปถึงได้เสมอ

เซตย่อยว่างมีผลรวมเป็นศูนย์ ดังนั้น dp[0] จึงเริ่มต้นเป็นจริง ผลรวมอื่นทั้งหมดเริ่มต้นเป็นเท็จ จนกว่าจะมีตัวเลขยืนยันว่าไปถึงได้

การเปลี่ยนสถานะ

สำหรับตัวเลขแต่ละตัว ให้ทำเครื่องหมายว่า s ไปถึงได้ หากก่อนหน้านี้ s - num ไปถึงได้แล้ว ตัวเลขหนึ่งตัวสามารถเปลี่ยนผลรวมหลายค่าให้เป็นจริงได้

for num in nums:
    for s in range(target, num - 1, -1):
        dp[s] = dp[s] or dp[s - num]

ย้อนกลับอีกครั้ง

ตัวเลขแต่ละตัวใช้ได้ไม่เกินหนึ่งครั้ง ดังนั้นรอบด้านในจึงต้องทำงานแบบ ย้อนกลับ เช่นเดียวกับปัญหากระเป๋าแบบ 0/1 หากวนไปข้างหน้า ตัวเลขจะถูกใช้ซ้ำ

อ่านผลตัดสิน

หลังประมวลผลตัวเลขทั้งหมดแล้ว dp[target] จะตอบคำถามนี้ ค่าจริงหมายความว่ามีเซตย่อยที่ถูกต้องอยู่ ส่วนค่าเท็จหมายความว่าเป็นไปไม่ได้

เข้าสู่ปัญหาการแบ่งส่วน

ปัญหา การแบ่งส่วน ถามว่า คุณสามารถแบ่งอาร์เรย์ออกเป็นสองส่วนที่มีผลรวมเท่ากันได้หรือไม่ ปัญหานี้ลดรูปเป็นปัญหาผลรวมของเซตย่อยได้โดยตรง

แบ่งผลรวมทั้งหมดครึ่งหนึ่ง

หากผลรวมทั้งหมดเป็นเลขคี่ การแบ่งเป็นสองส่วนเท่ากันย่อมเป็นไปไม่ได้ จึงตอบว่าไม่ทันที มิฉะนั้นเป้าหมายก็คือ total // 2

total = sum(nums)
if total % 2:
    return False
target = total // 2

นำปัญหาผลรวมของเซตย่อยกลับมาใช้

ตอนนี้เพียงตรวจสอบว่ามีเซตย่อยที่รวมกันได้ถึง total // 2 หรือไม่ หากส่วนหนึ่งมีผลรวมเท่ากับเป้าหมาย ส่วนที่เหลือจะกลายเป็น ส่วนที่สองซึ่งมีผลรวมตรงกันโดยอัตโนมัติ

ความซับซ้อน

ต้นทุนอยู่ในระดับ n คูณ target ซึ่งเป็นขอบเขตแบบ กึ่งพหุนาม วิธีนี้ทำงานเร็วเมื่อเป้าหมายมีขนาดเล็ก และช้าเมื่อผลรวมมีขนาดใหญ่มาก

ตระกูลปัญหาเดียวกัน

ผลรวมของสับเซต การแบ่งส่วน และปัญหากระเป๋าเป้ 0/1 ใช้กลไกเดียวกัน เมื่อสังเกตรูปแบบ เลือกหรือไม่เลือกได้ คุณก็สามารถนำลูปเดิมกลับมาใช้ซ้ำได้

ตรวจสอบความเข้าใจ

ทดสอบการลดรูปปัญหาการแบ่งส่วน

สรุปทบทวน

คุณแก้ปัญหาผลรวมของสับเซตด้วย DP แบบบูลีนและลูปย้อนกลับ จากนั้นลดรูปปัญหา การแบ่งส่วนให้เหลือการหาผลรวม // 2 กลไกเดิม แต่ได้ผลลัพธ์ใหม่ ✅

คำถามที่พบบ่อย

บทเรียน “ผลรวมเซตย่อยและการแบ่งส่วน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ผลรวมเซตย่อยและการแบ่งส่วน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ผลรวมเซตย่อยและการแบ่งส่วน”

ทำให้ถึงเป้าหมายด้วยเซตย่อยที่เลือก คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ผลรวมเซตย่อยและการแบ่งส่วน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม

ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. กระเป๋า 0/1: เลือกหรือไม่เลือก
  2. กระเป๋าที่ปรับปรุงการใช้พื้นที่
  3. DP แบบไม่จำกัดจำนวนและการทอนเหรียญ
  4. ผลรวมเซตย่อยและการแบ่งส่วน
← กลับไปที่ Coding Interview Prep