HDU 3449 依賴揹包

2022-06-03 02:03:12 字數 859 閱讀 8374

這道題雖然水水的,但是還是成功地給我增加了10多個wa。

最開始拿著題,一看,依賴揹包嘛~直接dfs樹形dp嗨起來,甚至連記憶體都沒有算一下,3mle;

然後又仔細看了一下題,沒有必要用樹形揹包來做嘛,對每個揹包01,就可以得到每個揹包的泛化物品。結果又沒有注意

把它們泛化物品的和寫成了完全揹包(囧),wa個無限。

做了很久才找到根源,結果又tle了(再囧)。

後來又想了想,其實在之前求01揹包的時候,就和後面的泛化物品求和有許多重複的計算,因為單純地泛化物品的和其實效率挺低的(n^2)

可以知道,當揹包容量比較大時,多次地求max(dp[0][j],dp[0][j-k]+dp[i][k])的無用計算非常之多。

因此看了網上的分析,發現根本沒有必要單獨拿出來求泛化物品,只需要把所有的物品看做在好幾組揹包裡面

每組揹包在考慮01之前,先各自扣除自己的「入場券」,就可以得到結果,時間複雜度(mi*n*w),在2s內可接受

#include#include

#include

using

namespace

std;

const

int size=600

;int

c[size],v[size],id;

intdp[size][size];

struct

edgeedge;

edge e[size

<<2

];int

main()

}dfs(0);

printf(

"%d\n",)

}}

最後再套用下dd大牛的一句話:失敗了並不是什麼可恥的事情,從失敗中全無收穫才是

hdu3449 有依賴的揹包問題

典型的有依賴的揹包,每個箱子是 主件 每個箱子所對應的物品是他的 附件 有依賴的揹包的過程就是把沒一組主件和附件的集合中附件跑一遍01揹包,然後把主件強加到跑完後的陣列裡,然後再在雖有的集合中選擇最優的dp i 的值,這樣更新到最後就行了,這樣更新 跑附件之間的01揹包後強加主件是對應著題意的必須有...

hdu3449 有依賴的揹包問題

典型的有依賴的揹包,每個箱子是 主件 每個箱子所對應的物品是他的 附件 有依賴的揹包的過程就是把沒一組主件和附件的集合中附件跑一遍01揹包,然後把主件強加到跑完後的陣列裡,然後再在雖有的集合中選擇最優的dp i 的值,這樣更新到最後就行了,這樣更新 跑附件之間的01揹包後強加主件是對應著題意的必須有...

HDU 3449Consumer(依賴揹包問題)

題目大意 有很多個箱子和一些物品,想買箱子中的物品必須先買下箱子,求在規定的錢數里最多能買多大價值的東西 sample input 3 800 300 2 30 50 25 80 600 1 50 130 400 3 40 70 30 40 35 60sample output 210emmm,沒什...