背包问题

Let V[i , j ] be the value obtained by filling a knappack of size j with

items taken from the first i items {u1, . . . , ui} in an optimal way.

The recurrence relation 

                0                                          if  i = 0  or  j = 0

V[i , j ] =     V[i ? 1, j ]                               if  j < Si

                max{V[i ? 1, j ],V[i ? 1, j ? Si ] + Vi}   if i > 0 and j  >= Si

 由上面的启发产生以下解法

1.空间复杂度为N*C的解法

Knapsack

1. for i   0 to n do V[i , 0]   0

2. for j   0 to C do V[0, j ]   0

3. for i   1 to n

4. for j   1 to C

5. V[i , j ]   V[i ? 1, j ]

6. if si j then V[i , j ]   max{V[i , j ],V[i ? 1, j ? si ] + vi}

7. end for

8. end for

9. return V[n, C]

 2.空间复杂度为C的解法,此解法是对上面解法的优化,降低了空间复杂度,但时间复杂度已经不能够简化

for i=1..N

for c=C..0

f[c] = max{f[c], f[c-s] + v}

对容量倒序是为了保证 f[c-s] 是第N-1次循环的结果,

其原理和解法1是完全一样的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值