Skip to content

【动态规划】背包问题

题目

现在有四个物品,背包总容量为 8,背包最多能装入价值为多少的物品?

物品编号 物品体积 物品价值
1 2 3
2 3 4
3 4 5
4 5 6
物品编号/背包容量 0 1 2 3 4 5 6 7 8
0 f(0,0)=0 f(0,1)=0 0 0 0 0 0 0 0
{id:4,size:5,value:6} f(4,0)=0
{id:3,size:4,value:5} 0
{id:2,size:3,value:4} 0
{id:1,size:2,value:3} 0 f(1,2) 3
f(k, w) = k.w > w ? f(k-1,w) : max(f(k-1,w), f(k-1,w-k.w)+k.v )
flowchart TD
A{"F(4,8)"}
A -- "选择 {id:4,size:5,value:6}" --> Y4{"F(3,8-5=31)+6"}
A -- "放弃 {id:4,size:5,value:6}" --> N4{"F(3,8)"}

Y4{"F(3,8-5)+6"} -- "选择第 3 件" --> Y4Y3["放不下"]
Y4{"F(3,8-5)+6"} -- "放弃第 3 件" --> Y4N3{"F(2,8-5)+6"}

Y4N3{"F(2,8-5)+6"} -- "选择第 2 件" --> Y4N3Y2{"F(1,8-5-3)+8+4"}
Y4N3{"F(2,8-5)+6"} -- "放弃第 2 件" --> Y4N3N2{"F(1,8-5)+8"}

Y4N3Y2{"F(1,8-5-3)+8+4"} -- "选择第 1 件" --> Y4N3Y2Y1["放不下"]
Y4N3Y2{"F(1,8-5-3)+8+4"} -- "放弃第 1 件" --> Y4N3Y2N1["F(0,8-5-3)+8+4"]

Y4N3N2 -- "选择第 1 件" --> Y4N3N2Y1{"F(0, 3-2) + 8 + 3"}
Y4N3N2 -- "放弃第 1 件" --> Y4N3N2N1{"F(0,3) + 8"}

N4 -- "选择第 3 件" --> N4Y3{"F(2, 8-4) + 5"}
N4 -- "放弃第 3 件" --> N4N3{"F(2, 8)"}

N4Y3 -- "选择第 2 件" --> N4Y3Y2("F(1,8-4-3)+5+4)")
N4Y3 -- "放弃第 2 件" --> N4Y3N2("F(1,8-4)"+5)

N4Y3Y2("F(1,8-4-3)+5+4)") -- "选择第 1 件" --> N4Y3Y1("放不下")
N4Y3Y2("F(1,8-4-3)+5+4)") -- "放弃第 1 件" --> N4Y3N1("F(0,8-4-3)+5+4")

N4Y3N2("F(1,8-4)"+5) -- "选择第 1 件" --> N4Y3N2Y1("F(0,8-4-2)+5+3")
N4Y3N2("F(1,8-4)"+5) -- "放弃第 1 件" --> N4Y3N2N1("F(0,8-4)+5")
flowchart TD
A["F(4,8)"] --> CHECK_4{"{id:4,size:5,value:6}"}
CHECK_4 -- "Y" --> Y4["F(3,8-5)+6 = F(3,3)+6"]
Y4 --> CHECK_3{"{id:3,size:4,value:5}"}
CHECK_3 -- "Y" --> Y4Y3["放不下"]
CHECK_3 -- "N" --> Y4N3["F(2,3)+6"]
Y4N3 -- CHECK_2{"{id:2,size:3,value:4}"}