0Pricing
Competitive Programming Academy · บทเรียน

กระเป๋าแบบแบ่งส่วนตามอัตราส่วน

เลือกสิ่งที่มีมูลค่าต่อน้ำหนักสูงสุดก่อน

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

การตั้งโจทย์กระเป๋าเป้

มีสิ่งของที่มีมูลค่าและน้ำหนัก พร้อมกระเป๋าที่มี ความจุ จำกัด เป้าหมายคือบรรทุกมูลค่ารวมให้ได้มากที่สุด 🎒

แบบแบ่งส่วนหมายถึงแบ่งได้

ในรูปแบบ แบ่งส่วน คุณสามารถหยิบสิ่งของเพียงบางส่วนได้ เช่น เมล็ดพืชครึ่งกระสอบ อิสระนี้เองที่ทำให้วิธีแบบละโมบใช้ได้ผล

มูลค่าต่อน้ำหนัก

ตัวชี้วัดสำคัญคือ อัตราส่วน มูลค่าต่อน้ำหนักของสิ่งของแต่ละชิ้น อัตราส่วนสูงหมายถึงบรรจุมูลค่าได้มากในพื้นที่เพียงเล็กน้อย

ratio = value / weight

เรียงตามอัตราส่วนที่ดีที่สุด

เรียงลำดับ สิ่งของตามมูลค่าต่อน้ำหนัก โดยเรียงจากมากไปน้อย แผนแบบละโมบคือเลือกสิ่งของที่มีความหนาแน่นของมูลค่าสูงที่สุดที่ยังมีอยู่

items.sort(key=lambda i: i[0] / i[1], reverse=True)

หยิบทั้งชิ้นตราบเท่าที่ยังใส่ได้

ไล่ดูรายการที่เรียงลำดับแล้ว และหยิบสิ่งของแต่ละชิ้น ทั้งหมด หากยังใส่ในความจุที่เหลือได้ เพิ่มมูลค่าเต็มจำนวนของสิ่งของนั้นลงในยอดรวม

if weight <= cap:
    total += value
    cap -= weight

เติมช่องว่างสุดท้าย

เมื่อสิ่งของชิ้นหนึ่งใหญ่เกินไป ให้หยิบมาเป็น เศษส่วน ที่เติมพื้นที่ว่างที่เหลือได้พอดี จากนั้นกระเป๋าจะเต็มและหยุดได้

total += value * (cap / weight)

เหตุใดลำดับตามอัตราส่วนจึงใช้ได้

ความจุแต่ละหน่วยควรบรรจุมูลค่าให้ได้มากที่สุด ดังนั้นสิ่งของที่ มีความหนาแน่นสูงที่สุด ต้องมาก่อน การสลับเป็นสิ่งของที่มีความหนาแน่นต่ำกว่าจะทำให้สูญเสียมูลค่า

กระเป๋าเป้แบบ 0/1 แตกต่างกัน

หากแบ่งสิ่งของไม่ได้ การเลือกแบบโลภตามอัตราส่วนจะใช้ไม่ได้ ปัญหาแบบ 0/1 ต้องใช้การโปรแกรมพลวัต ไม่ใช่การเรียงลำดับง่าย ๆ แบบนี้

เวลาทำงาน

การเรียงตามอัตราส่วนใช้เวลา O(n log n) และวงวนเติมของใช้เวลาเชิงเส้น ซึ่งเร็วเพียงพอสำหรับข้อจำกัดทั่วไปของการแข่งขัน

ระวังเศษส่วนสุดท้าย

ใช้เลขจุดลอยตัวหรือเศษส่วนที่คำนวณได้อย่างแม่นยำสำหรับสิ่งของบางส่วน การตัดทอนแต่เนิ่น ๆ อาจทำให้ค่าลดลงและทำให้ได้คำตอบผิด

พบการใช้งานที่ใด

ลองนึกถึงการบรรทุก สินค้า การผสมเชื้อเพลิง หรือการแบ่งทรัพยากร เมื่อใดก็ตามที่สิ่งของแบ่งเป็นส่วน ๆ ได้ วิธีโลภตามอัตราส่วนคือเครื่องมือของคุณ

ตรวจสอบอย่างรวดเร็ว

คุณกำลังบรรจุสิ่งของลงในกระเป๋าในปัญหากระเป๋าเป้แบบแบ่งได้

สรุป

เรียงสิ่งของตาม ค่าต่อน้ำหนัก หยิบสิ่งของทั้งชิ้นที่ยังใส่ได้ แล้วเติมด้วยสิ่งของบางส่วนจนเต็มกระเป๋า วิธีโลภนี้ให้คำตอบดีที่สุดเฉพาะเมื่อแบ่งสิ่งของได้เท่านั้น 🚀

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

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

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

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

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

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

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

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

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

ฉันเขียนและรันโค้ดในบทเรียน Competitive Programming Academy นี้ได้ไหม

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

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

  1. แนวคิดแบบโลภ
  2. การเลือกกิจกรรมตามเวลาสิ้นสุดที่เร็วที่สุด
  3. กระเป๋าแบบแบ่งส่วนตามอัตราส่วน
  4. สังเกตว่าเมื่อใดวิธีโลภใช้ไม่ได้
← กลับไปที่ Competitive Programming Academy