动态规划--01背包问题(1)

   学习算法可以知道机器怎么能像人一样思考,才、可以去搞大数据、人工智能等等。不说未来有多美好,眼下学算法本身就是很有趣儿的,研究每一个算法的精髓。

   前面的台阶问题是动态规划问题里面最简单的一个,只有一个维度的变化。今天的背包问题比前面稍微复杂一点,有两个变化维度。

   问题描述:

   有一个背包可盛的重量为4,现有3个物品,重量和价值如下表,问:如何让包内装入的物品具有最大的总价值?

 

 

物品

手机a

音响b

电脑c

价值v

1500

3000

2000

重量w

1

4

3

 

   我们可能会想,根据集合或排列组合可以知道共有7种放法,分别算出每一种组合的价值,通过比较得到价值最大的那个组合,就是背包里应该放的东西了。

   当每增加一件物品时,组合数量将会翻一倍,也就是说这种算法运行时间太慢。那么当物品有很多件时,我们应该怎么做才能很快地找出最优解呢?

   不妨这样想,往背包里放入物品的过程是一系列的决策过程,即某个物品放入背包还是不放,放或不放取决于能不能放,如果背包盛的下就可以放,盛不下就不放,那么放或者不放就会影响包内物品的总价值,我们计算价值的变化,总是保证当前价值最大,到最后一个物品决策完成,背包里的物品就确定了,而且一定是价值最大的情况。

   怎么算盛得下盛不下呢?我们按照合适的单位,比如1(或0.5),将背包分成不同大小的小背包,计算每一个物品在每一个小包容量的情况下,放入物品的最大价值。

   我们画下面这样一个表格。

 

 

 

1

2

3

4

a(1,1500)

1500

1500

1500

1500

b(4,3000)

1500

1500

1500

3000

c(3,2000)

1500

1500

2000

3500

 

   下面说这个表格的数据是怎么来的。

 

   第一行:

   当背包可盛重量为1时,a重量为1,可放入,此时包最大价值为1500;

   当背包可盛重量为2时,a重量为1,可放入,尽管此时背包有重量1的剩余,但没有其它可放入的物品,此时包最大价值为1500;

   当背包可盛重量为3时,同上,此时包最大价值为1500;

   当背包可盛重量为4时,同上,此时包最大价值为1500;

 

   第二行:

   当背包可盛重量为1时,b重量为4,不可放入,此时背包还是上面计算过的结果,放入了a,此时包最大价值为1500;

   当背包可盛重量为2时,同上,此时包最大价值为1500;

   当背包可盛重量为3时,同上,此时包最大价值为1500;

   当背包可盛重量为4时,b重量为4,可放入,若放入价值为3000,不放入为1500,比较一下还是放入b,此时包最大价值为3000;

 

   第三行:

   当背包可盛重量为1时,c重量为3,不可放入,此时背包还是上面计算过的结果,放入了a,此时包最大价值为1500;

   当背包可盛重量为2时,c重量为3,不可放入,此时背包还是上面计算过的结果,放入了a,此时包最大价值为1500;

   当背包可盛重量为3时,c重量为3,可放入,若放入价值为2000,不放入为1500,比较一下还是放入c,此时包最大价值为2000;

   当背包可盛重量为4时,c重量为3,可放入,若放入c,包还剩余重量1,根据上面计算的结果当包可盛重量为1时最大价值为1500,此时价值为2000+1500=3500,不放入为3000,比较一下还是放入c,此时包最大价值为3500;

 

   由此可见,上面的问题答案为3500,背包内装入手机a和电脑c。

   

   这种求解的过程就是运用了动态规划,对于一眼就能看出的三件物品这个问题,求解的过程是有点繁琐,但对于一眼看不出的问题,这就是个很好的解决思路了。到这里,我们隐约看到了一点规律,那就是如果一个大问题没法下手的时候,我们可以把它分成小问题,而且后面的子问题还可以利用前面子问题的结果。就上面的例子而言,每增加一个物品,在计算新的一行的最大价值时,总是会用到上一行的某个或某两个格子的值,这就是规律。画表格的过程就是思考的过程,是利用动态规划求解最优解的过程,接下来我们根据这个思路,总结出动态规划的步骤去求得最优解。也就是:

  1. 刻画背包问题的最优解的结构。
  2. 递归定义最优解的值。
  3. 计算背包问题最优解的值。
  4. 根据计算的结果构造问题最优解。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值