ข้อปัญหาถุงเป้
หน้าตา

ข้อปัญหาถุงเป้ (อังกฤษ: knapsack problem) คือปัญหาต่อไปนี้ในการหาค่าเหมาะที่สุดเชิงการจัด (combinatorial optimization):
- กำหนดให้มีชุดสิ่งของ โดยแต่ละชิ้นมีน้ำหนักและมูลค่า จงพิจารณาว่าควรเลือกสิ่งของใดบ้างมารวมอยู่ในชุด โดยที่น้ำหนักรวมต้องน้อยกว่าหรือเท่ากับค่าที่กำหนด และมูลค่ารวมต้องมีค่ามากที่สุดเท่าที่จะเป็นไปได้
ถุงเป้ 0/1
[แก้]ข้อปัญหาถุงเป้ 0/1 คือการเลือกหยิบของใส่ถุงโดยให้มีมูลค่ารวมสูงที่สุด แต่น้ำหนักโดยรวมต้องไม่เกินน้ำหนักที่บรรจุได้ โดยของแต่ละชิ้นจะมีน้ำหนักและมูลค่าแตกต่างกันไป ที่เรียกว่า 0/1 นั้นเพราะเมื่อหยิบของจะเป็นก้อนๆ จะไม่แบ่งย่อยเป็นชิ้นๆ แต่ถ้าแบ่งย่อยได้จะเป็นอีกปัญหาหนึ่ง (fractional knapsack problem)
การแก้ปัญหา
[แก้]- วิธีที่ตรงไปตรงมาที่สุดคือการไล่ทดลอง หยิบ/ไม่หยิบ ของแต่ละชิ้น แล้วหามูลค่ารวมที่มากที่สุดโดยน้ำหนักรวมไม่เกินที่กำหนด
- การใช้ Dynamic programming เข้ามาเพื่อหลีกเลี่ยงการทำซ้ำๆ โดยสร้าง array K[][]
def knapSack(W, wt, val, n):
K = [[0 for x in range(W+1)] for x in range(n+1)]
# Build table K[][] in bottom up manner
for i in range(n+1):
for w in range(W+1):
if i==0 or w==0:
K[i][w] = 0
elif wt[i-1] <= w:
K[i][w] = max(val[i-1] + K[i-1][w-wt[i-1]], K[i-1][w])
else:
K[i][w] = K[i-1][w]
return K[n][W]
อ้างอิง
[แก้]detohm. 0-1-knapsack-problem-. FINOMENA. 14 May 2018