24. Knapsack Problem with Backtracking Algorithm
Algorithm KnapsackBT( w[n], v[n], wx, I, x ) : value
b := 0
for k := i to n-1
if w[k] <= wx then
a := v[k] + KnapsackBT( w, v, wx-w[k], k+1, y )
if a > b then b := a, x := y {k}
Return b
End Algorithm
อ. กิตตินันท์ น้1อยมณี 24
25. Knapsack Problem with Backtracking Algorithm
Algorithm KnapsackBT( w[n], v[n], wx, I, x ) : value
b := 0
for k := i to n-1
if w[k] <= wx then
a := v[k] + KnapsackBT( w, v, wx-w[k], k+1, y )
if a > b then b := a, x := y {k}
Return b
End Algorithm
อ. กิตตินันท์ น้1อยมณี 25
เก็บ Value สูดสุดของโหนดลูกไว้ ซึ่ง
ตอนนี้เก็บ 0 ไปก่อน เพราะยังไม่รู้ว่า
จะเลือกลูกคนไหนดี (ที่มากที่สุด)
26. Knapsack Problem with Backtracking Algorithm
Algorithm KnapsackBT( w[n], v[n], wx, I, x ) : value
b := 0
for k := i to n-1
if w[k] <= wx then
a := v[k] + KnapsackBT( w, v, wx-w[k], k+1, y )
if a > b then b := a, x := y {k}
Return b
End Algorithm
อ. กิตตินันท์ น้1อยมณี 26
i จะเป็นตัวเริ่มต้นว่าเริ่มที่ไหน โดยตัว
สุดท้ายคือตัวที่ n-1 ดังนั้น for ก็มีไว้เพื่อ
แตกโหนดลูก ภายใน for จึงเป็นขั้นตอนการ
สร้างโหนดลูกนั่นเอง โดยโหนดลูกจะต้องมี
น้ําหนักไม่เกินกระเป๋าของโหนดแม่
27. Knapsack Problem with Backtracking Algorithm
Algorithm KnapsackBT( w[n], v[n], wx, I, x ) : value
b := 0
for k := i to n-1
if w[k] <= wx then
a := v[k] + KnapsackBT( w, v, wx-w[k], k+1, y )
if a > b then b := a, x := y {k}
Return b
End Algorithm
อ. กิตตินันท์ น้1อยมณี 27
ถ้าน้ําหนักไม่เกินก็จะแตกโหนดลูกตรงนี้ทันที
28. Knapsack Problem with Backtracking Algorithm
Algorithm KnapsackBT( w[n], v[n], wx, I, x ) : value
b := 0
for k := i to n-1
if w[k] <= wx then
a := v[k] + KnapsackBT( w, v, wx-w[k], k+1, y )
if a > b then b := a, x := y {k}
Return b
End Algorithm
อ. กิตตินันท์ น้1อยมณี 28
อันนี้ต้องขยายความกันหน่อย
30. Knapsack Problem with Backtracking Algorithm
• i ตอนแรกเอาลูกทุกอันมาคิด ดังนั้นถ้าเราจะคิดต่อ เรา
จะไม่กลับมาคิดชิ้นที่ 0 อีกแล้ว (ตอนที่มันเข้ามาคือ i
และที่ต่อ i ก็คือ k+1 นั่นเอง) มันจะวนไปตามโหนดลูก
เรื่อยๆ
• ส่วน y นั้นควรจะเริ่มต้นเป็น Array เปล่าๆ โดยควรแทรก
เข้าไปใน Code
• แล้วลูกของมันก็จะเอาค่าคืนกลับมา ว่าได้ค่าอะไรมาบ้าง
(แทรกไว้ก่อน if)
อ. กิตตินันท์ น้1อยมณี 30
31. Knapsack Problem with Backtracking Algorithm
Algorithm KnapsackBT( w[n], v[n], wx, I, x ) : value
b := 0
for k := i to n-1
if w[k] <= wx then
a := v[k] + KnapsackBT( w, v, wx-w[k], k+1, y )
if a > b then b := a, x := y {k}
Return b
End Algorithm
อ. กิตตินันท์ น้1อยมณี 31
ต่อมา b จะเก็บ Value สูงสุดอยู่ ดังนั้น
ถ้าเราเจอลูกที่ดีกว่า (เยอะกว่า) ก็จะ
เปลี่ยนมาใช้ b แทน
32. Knapsack Problem with Backtracking Algorithm
Algorithm KnapsackBT( w[n], v[n], wx, I, x ) : value
b := 0
for k := i to n-1
if w[k] <= wx then
a := v[k] + KnapsackBT( w, v, wx-w[k], k+1, y )
if a > b then b := a, x := y {k}
Return b
End Algorithm
อ. กิตตินันท์ น้1อยมณี 32
y คือวัตถุที่เลือกจากโหนดลูก และ
คําตอบเป็น Pass by reference ดังนั้น
คําตอบจึงออกไปได้อยู่แล้ว
33. Knapsack Problem with Backtracking Algorithm
Algorithm KnapsackBT( w[n], v[n], wx, I, x ) : value
b := 0
for k := i to n-1
if w[k] <= wx then
a := v[k] + KnapsackBT( w, v, wx-w[k], k+1, y )
if a > b then b := a, x := y {k}
Return b
End Algorithm
อ. กิตตินันท์ น้1อยมณี 33
สุดท้ายเราจะได้มูลค่าสูงสุดละจะอยู่ใน b นั่นเอง