代码如图。题目是洛谷P1776。虽然不超时的用例都过了,但我仍然不能确定我这个混合了贪心思路的动态规划最终得到的是正解还是近似解。
一来,假如没有开头的价值密度排序,我这个算法就几乎不可能通过任何n>5的用例,轻而易举就能构造出一大堆反例,这让我严重怀疑动态规划在这里有没有起到作用。如果没有起到作用那这就是纯贪心,而纯贪心搞多重背包显然只可能得到近似解(甚至如果你打定主意用纯贪心近似的话,都可以直接O(n)复杂度,连我这O(nW)都省了)。
二来,我自己都不太理解我写的这个状态转移方程的实际意义,第一段套的是完全背包的模板,第二段单纯是为了防止dp[lbk]i[rbk][lbk]j[rbk]随着j增大可能减小的情况。你要说我完全一点主动设计都没有倒也不至于,但按照我原来的设想,根本不需要排序。
具体到某个用例上,我能理解为什么不排序过不去,否则也不会想到排序的方法;但上升到状态转移方程层面上,就又迷惑了。
ps: 超时不是复杂度问题,这题计算机专业的学长用C++写个常规的二进制分解01背包,O(nWlogn)复杂度,也能过,而这个O(nW)过不了单纯是因为python,但我只会写python。


一来,假如没有开头的价值密度排序,我这个算法就几乎不可能通过任何n>5的用例,轻而易举就能构造出一大堆反例,这让我严重怀疑动态规划在这里有没有起到作用。如果没有起到作用那这就是纯贪心,而纯贪心搞多重背包显然只可能得到近似解(甚至如果你打定主意用纯贪心近似的话,都可以直接O(n)复杂度,连我这O(nW)都省了)。
二来,我自己都不太理解我写的这个状态转移方程的实际意义,第一段套的是完全背包的模板,第二段单纯是为了防止dp[lbk]i[rbk][lbk]j[rbk]随着j增大可能减小的情况。你要说我完全一点主动设计都没有倒也不至于,但按照我原来的设想,根本不需要排序。
具体到某个用例上,我能理解为什么不排序过不去,否则也不会想到排序的方法;但上升到状态转移方程层面上,就又迷惑了。
ps: 超时不是复杂度问题,这题计算机专业的学长用C++写个常规的二进制分解01背包,O(nWlogn)复杂度,也能过,而这个O(nW)过不了单纯是因为python,但我只会写python。



