ปัญหาเป้แบบเศษส่วนในภาษา C++ หมายถึงการระบุวิธีการบรรจุสิ่งของที่มีน้ำหนักและกำไรที่กำหนดลงในกระเป๋าในลักษณะที่ทำให้กระเป๋ามีมูลค่าสูงสุดโดยไม่เกินขีดจำกัดสูงสุด
วิธีแก้ปัญหา Fractional Knapsack ใน C ++
เมื่อกำหนดชุดของสินค้า โดยแต่ละรายการมีน้ำหนักและกำไรที่กำหนด ให้กำหนดจำนวนสิ่งของแต่ละชิ้นในการรวมกันว่าน้ำหนักรวมของสินค้าน้อยกว่าขีดจำกัดสูงสุดของกระเป๋า แต่ต้องรักษามูลค่าให้มากที่สุดเท่าที่จะเป็นไปได้
อัลกอริทึมในการนำปัญหาเป้นเศษส่วนไปใช้
การทำงานของอัลกอริทึม Knapsack สามารถเข้าใจได้จากประเด็นต่อไปนี้:
- รับน้ำหนักและกำไรสองอาร์เรย์
- ตั้งค่ากระสอบสูงสุดเป็น W
- กำหนดความหนาแน่นโดยการใช้อัตราส่วนของพารามิเตอร์ทั้งสอง
- จัดเรียงรายการตามลำดับความหนาแน่นลดลง
- เพิ่มค่าจนเป็น <=W
แนวทางโลภในการแก้ปัญหากระเป๋าเป้สะพายหลังแบบเศษส่วน
แนวทางที่ละโมบมีจุดมุ่งหมายเพื่อสร้างทางเลือกที่เหมาะสมในแต่ละขั้นตอน ซึ่งจะนำไปสู่ทางออกที่ดีที่สุดในตอนท้าย แก้ปัญหาทีละขั้นตอนจนนำไปสู่ข้อสรุป แทนที่จะสรุปผลในตอนท้ายเท่านั้น นี่คือซอร์สโค้ดสำหรับการนำวิธีแก้ปัญหาเศษส่วนแบบแบ็คแพ็คมาใช้ใน C ++:
#รวม
โดยใช้ เนมสเปซ มาตรฐาน ;
โครงสร้าง วัตถุ {
ภายใน มูลค่าน้ำหนัก ;
วัตถุ ( ภายใน ค่า, ภายใน น้ำหนัก )
: : ค่า ( ค่า ) , น้ำหนัก ( น้ำหนัก )
{
}
} ;
บูล ซีเอ็มพี ( โครงสร้าง วัตถุ x, โครงสร้าง วัตถุ ย )
{
สองเท่า A1 = ( สองเท่า ) x. ค่า / x. น้ำหนัก ;
สองเท่า A2 = ( สองเท่า ) และ. ค่า / และ. น้ำหนัก ;
กลับ A1 > A2 ;
}
สองเท่า เศษส่วนเป้ ( โครงสร้าง วัตถุอาร์เรย์ [ ] ,
ภายใน ใน, ภายใน ขนาด )
{
เรียงลำดับ ( ครับ ครับ + ขนาด, ซม ) ;
ภายใน curWeight = 0 ;
สองเท่า ค่าสุดท้าย = 0.0 ;
สำหรับ ( ภายใน ฉัน = 0 ; ฉัน < ขนาด ; ฉัน ++ ) {
ถ้า ( curWeight + อ๊าก [ ฉัน ] . น้ำหนัก <= ใน ) {
curWeight + = อ๊าก [ ฉัน ] . น้ำหนัก ;
ค่าสุดท้าย + = อ๊าก [ ฉัน ] . ค่า ;
}
อื่น {
ภายใน ยังคง = ใน - - curWeight ;
ค่าสุดท้าย + = อ๊าก [ ฉัน ] . ค่า
* ( ( สองเท่า ) ยังคง
/ อ๊าก [ ฉัน ] . น้ำหนัก ) ;
หยุดพัก ;
}
}
กลับ ค่าสุดท้าย ;
}
ภายใน ใน = 60 ;
วัตถุอาร์เรย์ [ ] = { { 100 , ยี่สิบ } ,
{ 380 , 40 } ,
{ 140 , 10 } ,
{ 180 , 30 } } ;
ภายใน ขนาด = ขนาดของ ( อ๊าก ) / ขนาดของ ( อ๊าก [ 0 ] ) ;
ศาล << 'กำไรสูงสุด = '
<< เศษส่วนเป้ ( arr, v, ขนาด ) ;
กลับ 0 ;
}
ในโค้ดนี้ มีการกำหนดโครงสร้างออบเจ็กต์ซึ่งมีค่าน้ำหนักและกำไรเก็บไว้ในนั้น bool cmp() ใช้เพื่อทำการเปรียบเทียบระหว่างวัตถุสองชิ้นโดยพิจารณาจากอัตราส่วนของน้ำหนักและมูลค่าของวัตถุทั้งสอง อาร์เรย์ถูกจัดเรียงตามลำดับจากมากไปน้อยและค่าจะเพิ่มขึ้นเรื่อยๆ จนกระทั่งถึงค่าสูงสุด หากค่าปัจจุบันได้รับอนุญาตและอยู่ภายในขีดจำกัด ค่านั้นจะถูกเพิ่ม มิฉะนั้น อัตราส่วนที่ลดลงจะถูกเพิ่มลงในถุง ขนาดของน้ำหนักและมูลค่าถูกป้อนไว้ในรหัสหลัก และกำไรสูงสุดจะถูกพิมพ์ลงบนเอาต์พุต
กำไรสูงสุดที่เก็บไว้ในขนมคือ 580
บทสรุป
ปัญหาเป้แบบเศษส่วนในภาษา C++ หมายถึงการระบุวิธีการบรรจุสิ่งของที่มีน้ำหนักและกำไรที่กำหนดลงในกระเป๋าในลักษณะที่ทำให้กระเป๋ามีมูลค่าสูงสุดโดยไม่เกินขีดจำกัดสูงสุด สิ่งนี้สามารถบรรลุได้ด้วยแนวทางโลภที่มีจุดมุ่งหมายเพื่อสร้างทางเลือกที่เหมาะสมในแต่ละขั้นตอน ซึ่งจะนำไปสู่ทางออกที่ดีที่สุดในตอนท้าย