0%

算法大作业笔记(六)

先了解一下背包问题吧:

背包问题主要有三类:01背包,完全背包,多重背包

01背包

有N件物品和一个容量为V的背包。第i件物品的价格(即体积,下同)是w[i],价值是c[i]。用f[i][j]表示前i个背包装入容量为v的背包中所可以获得的最大价值。对于一个物品,只有两种情况

  情况一: 第i件不放进去,这时所得价值为:f[i-1][v]

  情况二: 第i件放进去,这时所得价值为:f[i-1][v-c[i]]+w[i]

状态转移方程:f[i][v] = max(f[i-1][v], f[i-1][v-w[i]]+c[i])

完全背包

有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是w[i],价值是c[i]。完全背包和01背包区别就是完全背包物品有无限件,由之前的选或者不选转变成了选或者不选,选几件

状态转移方程:f[i][v]=max(f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v)

多重背包

有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是w[i],价值是c[i]。多了一个限制条件,每个物品规定了可用的次数。

状态转移方程:f[i][v]=max(f[i-1][v-k*w[i]]+ k*c[i]|0<=k<=n[i])


开始新的算法大作业的征程~~

问题情景

一个不同长度的彩带集合,用来绑不同大小的礼物盒,不同尺寸的礼物盒需要不同长度的彩带,问:这个固定的彩带集合最多能绑多少个礼物盒?

贪心算法的尝试

初步文档已经写好,现在开始写代码。

首先把需要的排好序的彩带和需求数组、二分查找的指针准备好。

现在进入while循环,开始二分查找上限。

现在该写meet()函数,判断当前连续需求是否能满足。

明天测试一下二分法遍历彩带长度的代码,我觉得会有问题。并完成继续递归的部分。

二分法遍历彩带长度失败了…….先用for循环吧,明天看看能不能改进。至少现在的代码跑那个样例没有问题。

动态规划的尝试

有两种思路:自顶向下和自顶向上。需要考虑不同的情况,得出递推式,然后写代码。

怎么把动态规划算法和分治算法结合起来呢???暂时觉得,这个题用不了分治,每增加一条彩带,现有的所有彩带的剪切方式都是可能改变的。而不像序列比对,前后两部分不会相互影响。


nondyminic

/(ㄒoㄒ)/~~哭了,动态算法解不了,要用分支界定法,那是个什么东西啊(ㄒoㄒ)