01揹包變形 求第k大揹包
多開一維[k],兩種情況分別放在a,b兩個陣列裡,將ab合併(即從小到大排序 取第k大)
開乙個大小為k的陣列f[i][v][1..k]。其中f[i][v][k]表示前i個物品、揹包大小為 v時,第k優解的值。
可以理解成,由f[i-1][v]和f[i-1][v-c[i]]+w[i]這兩個有序佇列合併得到的。
再加入一維k,有序佇列f[i-1][v]即f[i-1][v][1..k],f[i-1][v-c[i]]+w[i]則理解為在f[i-1][v-c[i]] [1..k]的每個數上加上w[i]後得到的有序佇列。
合併這兩個佇列,f[n][v][k]即是
最後的答案
#include #include using namespace std;
int dp[1005][1005],aa[1005],bb[1005];
int main()
aa[k+1]=bb[k+1]=-1;
a=b=c=1;
while(c<=k && (aa[a]!=-1 || bb[b]!=-1))
}cout<
hdu2639 01揹包k優解)
沒怎麼理解題意,題意 有n件物品,揹包體積為v,給出一行價值和一行花費,求第k優解,每個物品只能取一次。思路 不考慮k優解,顯然是個簡單的01揹包,1維的陣列足夠表示。即便要求k優解,在k 30的條件下,此題再加1維也沒什麼好說的,用dp j k 表示揹包體積為j時的k優解,一開始不知道怎麼轉移,原...
HDU2955 01 揹包變形
dp i j 表示從前 i 家銀行中搶劫某些家,得到 j 價值 而不被抓住的概率。dp j max dp j dp j val i 1 w i 將全部銀行的錢當做揹包的最大體積 那麼每家銀行的錢則當做物品的體積 那麼被抓的概率當做物品的價值 那麼便容易推出我們所需要的動態方程 dp i max dp...
hdu 2955 0 1揹包變形
題目大意 劫匪搶銀行,要求被抓概率小於p。共有n個銀行,第i個銀行錢數為m i 被抓概率為p i float型 求劫匪最多能搶多少錢 思路 由於代價 被抓概率 是浮點型且不能直接相加,所以不能以代價為揹包。這個題目可以以獲得的價值 即搶到的錢數 為揹包,求搶到一定錢時逃跑的概率 雖然搶到的錢數不是連...