首页 > 代码库 > 背包问题--求第K大值

背包问题--求第K大值

这算法有毒,一不小心沾上了不死也脱皮!

在背包问题中这个求第K大值就骚扰了我一整天,让我心神不宁,浑身难受- -!

我看到的这种写法是把原本的DP[X]加一维变成DP[X][Y],X用来确定当前背包容量,Y则是Y个值,分别是记录从最大到第K大,(因为只要求K大,所以那些更小的值就不用记录了)

接下来是讨论这个DP[X][Y],可以理解为它是表示的背包容量为X时的第Y大值,而DP[X][ ]可以理解为所有背包容量为X时的值,这样就方便下面的理解了。

在一般背包解决问题中用的01背包公式大约就是DP[X]=MAX(DP[X],DP[X-V]+W),这个是简化版的,把原本的二维改用一维了,做过01背包的都知道吧,然后在加上"第K大值"这个条件之后,就变化成了DP[X][K]={ DP[X][1] , DP[X-V][1]+W , DP[X][2] , DP[X-V][2]+W, .... , DP[X][K] , DP[X-V][K]+W }这样一个集合,懂不懂?就是对于每个DP[X][K]都可以得出两个值,一个是没有把当前物品S(V,W)  <V是容量,W是价值> 放进来的值DP[X][K],还有把这个物品放进来的值DP[X-V][K]+W,第二个值的寓意是指对于放入这个物品后体积正好达到当前考虑的背包的容量值背包每一个值都放入物品得到的值,因为DP[X][ ]中记录的是容量为X的背包可以得到的所有值,所以懂了吧?画个图吧!我最喜欢用图说话了,本人学算法凡事用图说明的都出奇的快,嘎嘎!



再次强调哦,DP[X][ ]中记录的是容量为X的背包中能装物品得出的所有数据,在求K大值时只保留前K大的那几个。

背包问题--求第K大值