完全背包问题----思想的理解

本文深入探讨完全背包问题,通过解析《算法竞赛入门经典》和《背包九讲》中的观点,理解完全背包与01背包的状态转移方程。从硬币问题出发,阐述如何使用动态规划解决完全背包问题,包括两种不同的状态转移策略,并对比两种书中对问题的处理方式。最后,介绍了如何从01背包问题推广到完全背包问题。
摘要由CSDN通过智能技术生成

最近学习动态规划,在背包问题处被卡了很久,故在此处把这几天的遇到的问题和自己的理解进行一下总结。


这篇博文主要介绍的是完全背包的思想,包括它的三种状态转移方程。作为引入完全背包问题的前提,附带的介绍了DAG思想和01背包问题。

参考资料有《算法竞赛入门经典》和《背包九讲》。


1.在《算法竞赛入门经典》中,其对完全背包问题是通过DAG的思想来讨论的。先讨论了完全背包问题,再推广到01背包问题。

2.在《背包九讲》中,讨论顺序相反,其对完全背包的讨论是通过01背包的思想推广而来。


一、先来理解《算法竞赛入门经典》的思想。

在看完全背包问题时先来看一个硬币问题。描述如下:

有n中硬币,每种硬币的面值为v1,v1......vn.且每种硬币有无限多。现在给定一个非负整数S,可以选用多少个硬币,使得面值之和恰好为S。输出硬币数目的最小值和最大值。


分析:如何通过建图求解

把要凑足的总面值看成一个个点。起点为S,终点为0. 

那么什么样的两个点是联通的呢?很显然点i到点i-vj(i>=vi)是联通的。取硬币j,状态就由i转移到了i-vj,点i与i-vj联通说面这两点之间有一条线。

很显然,从点i出发的线可能是0条,也可能不止一条。

我们现在的问题就变成了从点S到点0,最长的路径和最短的路径。


定义的d[i]为面值之和为i时最大的硬币数目。则有:

d[i] = max(d[i-v[j]]+1)   j : 0->n  且   i-v[j]>=0

这个方

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值