背包问题怎么求第 k 大值
  • 板块学术版
  • 楼主残阳如血
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/5/25 20:25
  • 上次更新2024/5/25 22:13:09
查看原帖
背包问题怎么求第 k 大值
726139
残阳如血楼主2024/5/25 20:25

rt,教练讲了思路:

背包的第 kk 优解

普通的 01 背包求的是最优解,在普通的背包 DP 方法上稍作改动,增加以为用于记录当前状态下的前 kk 优解,即可得到求 01 背包第 kk 优解的算法。

具体的,设 fi,j,kf_{i,j,k} 表示考虑前 ii 个物品,体积是 jj 的条件下,第 kk 优解的价值。

考虑原本的转移,fi,j=max⁡{fi−1,j,fi−1,j−vi+wi}f_{i,j}=\max\{f_{i-1,j},f_{i-1,j-v_i}+w_i\}。

  • 所有不选 ii 的决策构成序列 [fi−1,j,1,fi−1,j,2,…,fi−1,j,k][f_{i-1,j,1},f_{i-1,j,2},\dots,f_{i-1,j,k}];

  • 所有选 ii 的决策构成序列 [fi−1,j−vi,1+wi,…,fi−1,j−vi,k+wi][f_{i-1,j-v_i,1}+w_i,\dots,f_{i-1,j-v_i,k}+w_i]。

将两个序列合并即可得到 fi,j,∗f_{i,j,*}。

时间复杂度 O(nmk)O(nmk)。


但是蒟蒻不会写代码。。。

help!

2024/5/25 20:25
加载中...