【动态规划】背包问题
题目
现在有四个物品,背包总容量为 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}"}