(1)问题描述:
背包问题: 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是w[i],得到的价值是v[i]。每件物品只能装入背包一次,求解将哪些物品装入背包里物品价值总和最大。
(2)设计数据结构:
n个物品的重量存储在数组w[n+1]中,从下标1开始存放
n个物品的价值存储在数组v[n+1]中,从下标1开始存放
背包容量为 C
数组V[n+1][C+1]存放迭代结果,V[i][j]表示i个物品装入容量为j的背包中获得的最大价值
数组x[n+1]存储装入背包的物品
(3)定义子问题;
设 V(i,j)表示将i(1≤i≤n)个物品装入容量为j(1≤j≤C)的背包获得的最大价值。
在决策xᵢ时,已经确定了(x₁,x₂,...,xᵢ-₁),有以下两种情况。
(1)背包容量不足以装入物品i,则装入前i个物品得到的最大价值和装入前i-1个物品得到的最大价值相同,即xᵢ=0,背包不增加价值。
(2)背包容量可以装入物品i,此时有两种选择:
①把第i个物品装入背包,则背包中物品的价值等于把前 i-1个物品装入容量为j-wᵢ的背包得到的价值加上第i个物品的价值vᵢ;
②第i个物品不装入背包,则背包中物品的价值等于把前i-1个物品装入容量为j的背包中所取得的价值。
取①②中价值较大者作为把前i个物品装人容量为j的背包获得的最优值。
(4)定义动态规划函数:
(5)设计算法伪码或画流程图:
(6)时间复杂性、空间复杂性:
时间复杂性是O(n*C),空间复杂性是 O(n*C)