数据结构——动态规划

本文详细探讨了动态规划在解决01背包问题中的应用。通过反证法证明了01背包问题符合最优解原理,进而阐述了动态规划的思路,包括问题抽象、最优子结构和递推公式。并逐步展示了如何通过动态规划填表求解,从i=1到i=4的物品选择过程,以及递归方法实现。动态规划的空间和时间复杂度分别为O(nw),其中n为物品数量,w为背包容量。
摘要由CSDN通过智能技术生成

动态规划是算法中的一个难点;
思路主要是:
1.将模型抽象,提取出数据之间的抽象关系,并且满足最优解原理;
2.满足最优解,将问题小化为子问题,转化为递推形式;

01背包问题

N=10时:

i 1 2 3 4
weight 1 3 4 5
value 2 5 6 7

对于固定容积(capacity),如何放入,价值最大?

对于这样一个问题,将其划分为若干子问题的前提是该问题符合最优解原理;
参考网络上简单的证明:采用反证法:
s[4]为记录物品装入的组合:exp:(0,1,1,0)中,1表示装入,0表示未装入;
对于容积N的背包:装入物品组合的最优解为s[v1,v2,v3,v4];
{v1,v2,v3,v4}为当前问题的最优解;
对于该背包的子问题(容积小于之前背包i=1的容积时)
{v2,v3,v4}为当前问题最优解;假设当前最优解为{z2,z3,z4}时,那么N时,最优解为v1+{z2,z3,z4};
与{v1,v2,v3,v4}相矛盾,所以该问题复合最优解原理.(即前一状态构成后续阶段决策的最后序列

满足最优解原理,该算法具有可拆分性;

F(i,j)表示对于j容量的背包,前i件物品最佳组合,所组成的最大价值;
j<w(i)时:F(i,j)=F(i-1,j);
else:
F(i,j)=max(F(i-1,j),F(i-1,j-w(i))+v(i));
F(i-1,j-w(i))+v(i)表示前i-1件在j-w(i)容量下的最优解的价值+该件物品的价值;

所以
j<w(i):F(i,j)=F(i-1,j);
j>=w(i):F(i,j)=max(F(i-1,j),F(i-1,j-w(i))+v(i));

填表j=0时,F(i,0)=0;无法装入任何物品,无价值,F(0,j)=0装入0件物品,无价值(边界条件)
w(1)=1,F(1,1)=F(0,0)+v(1)=2;
F(1,2)=F(0,1)+v(1)=2;
F(1,3)=F(0,2)+v(1)=2;

F(1,10)=F(0,9)+v(1)=2;

i j 0 1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 0 0 0 0 0 0 0
1 0 2 2 2 2 2 2 2 2 2 2
2 0
3 0
4 0

i=2时:
w(2)=3
F(2,1)=F(1,1)=2;
F(2,2)=F(1,2)=2;
F(2,3)=max(F(1,3),F(1,0)+v(2))=5;
F(2,4)=max(F(1,4),F(1,1)+v(2))=7;
F(2,5)=max(F(1,5),F(1,2)+v(2))=7;

F(2,10)=max(F(1,10),F(1,7)+v(2))=7;

i j 0 1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 0 0 0 0 0 0 0
1 0 2 2 2 2 2 2 2 2 2 2
2 0 2 2 5 7 7 7 7 7 7 7
3 0
4 0

i=3时:
w(3)=4
F(3,1)=F(2,1)=2;
F(3,2)=F(2,2)=2;
F(3,3)=F(2,3)=5;
F(3,4)=max(F(2,4),F(2,0)+6)=max(7,6)=7;
F(3,5)=max(F(2,5),F(2,1)+6)=max(7,8)=8;
F(3,6)=max(F(2,6),F(2,2)+6)=8;
F(3,7)=max(F(2,7),F(2,3)+6)=11;
F(3,8)=max(F(2,8),F(2,4)+6)=13;

i j 0 1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 0 0 0 0 0 0 0
1 0 2 2 2 2 2 2 2 2 2 2
2 0 2 2 5 7 7 7 7 7 7 7
3 0 2 2 5 7 8 8 11 13 13 13
4 0

i=4:
w(4)=5
F(4,1)=F(3,1)=2;
F(4,2)=F(3,2)=2;
F(4,3)=F(3,3)=5;
F(4,4)=F(3,4)=7;
F(4,5)=max(F(3,5),F(3,0)+7)=max(8,7)=8;
F(4,6)=max(F(3,6),F(3,1)+7)=9;
F(4,7)=max(F(3,7),F(3,2)+7)=11;
F(4,8)=max(F(3,8),F(3,3)+7)=13;
F(4,9)=max(F(3,9),F(3,4)+7)=14;
F(4,10)=max(F(3,10),F(3,5)+7)=15;

i j 0 1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 0 0 0 0 0 0 0
1 0 2 2 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值