怎麼求01揹包第K優解

時間 2025-06-09 03:26:09

1樓:匿名使用者

求次優解、第k優解。

對於求次優解、第k優解類的問題,如果相應的最優解問題能寫出狀態轉移方程、用動態規劃解決,那麼求次優解往往可以相同的複雜度解決,第k優解則比求最優解的複雜度上多乙個係數k。

其基本思想是將每個狀態都表示成有序佇列,將狀態轉移方程中的max/min轉化成有序佇列的合併。這裡仍然以01揹包為例講解一下。

首先看01揹包求最優解的狀態轉移方程:f[i][v]=max。如果要求第k優解,那麼狀態f[i][v]就應該是乙個大小為k的陣列f[i][v][1..

k]。其中f[i][v][k]表示前i個物品、揹包大小為v時,第k優解的值。「f[i][v]是乙個大小為k的陣列」這一句,熟悉c語言的同學可能比較好理解,或者也可以簡單地理解為在原來的方程中加了一維。

顯然f[i][v][1..k]這k個數是由大到小排列的,所以我們把它認為是乙個有序佇列。

然後原方程就可以解釋為:f[i][v]這個有序佇列是由f[i-1][v]和f[i-1][v-c[i]]+w[i]這兩個有序佇列合併得到的。有序佇列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]後得到的有序佇列。合併這兩個有序佇列並將結果(的前k項)儲存到f[i][v][1..

k]中的複雜度是o(k)。最後的答案是f[n][v][k]。總的複雜度是o(nvk)。

為什麼這個方法正確呢?實際上,乙個正確的狀態轉移方程的求解過程遍歷了所有可用的策略,也就覆蓋了問題的所有方案。只不過由於是求最優解,所以其它在任何乙個策略上達不到最優的方案都被忽略了。

如果把弊搏鋒每個狀態表示成乙個大小為k的陣列,並在這個陣列中銀悄有序的儲存該狀態可取到的前k個最優值。那麼,對於任兩個狀租晌態的max運算等價於兩個由大到小的有序佇列的合併。

另外還要注意題目對於「第k優解」的定義,將策略不同但權值相同的兩個方案是看作同乙個解還是不同的解。如果是前者,則維護有序佇列時要保證佇列裡的數沒有重複的。

2樓:匿名使用者

求揹包第k優解,直接進行揹包染色(也就是動規揹包,學名染色,俗名刷陣列),本題需要算出所有方案,最後快排。

先直接用01揹包的通用頃談方法雀棚碰做,然後掃一下f[i,j]陣列,把有用的儲存到c[k]之中,在排序。

**:var

n,v,a,b,i,j,k,l,num:longint;

f:array[0..2000,0..2000]of longint;

c:array[0..1000000]of longint;

procedure qsort(l,r:longint);

vari,j,x,y:longint;

begini:=l;

j:=r;x:=c[(l+r) div 2];

repeat

while c[i]>x do inc(i);

while x>c[j] do dec(j);

if not(i>j) then

beginy:=c[i]; c[i]:=c[j]; c[j]:=y;

inc(i);

dec(j);

end;until i>j;

if l0 then

for l:=1 to f[j,0] do

begininc(f[j+a,0]);

f[j+a,f[j+a,0]]:f[j,l]+b;

end;end;

end;readln(k);

for i:=v downto 1 do

for j:=1 to f[i,0] do

begininc(num);

c[num]:=f[i,j];

end;qsort(1,num);

writeln(num);

if (k<=num)and(c[k]<>0) then writeln(c[k]) else writeln('和笑are you crazy?')

end.

求 蘇見信 你的揹包 URL

ti 你的揹包 ar 信 al by 信 你的揹包。一九九五年。我們在機場的車站。你借我 而我不想歸還。那個揹包。都載滿記念品和患難。還有摩擦留下你的圖案。你的揹包。背到現在還沒爛。卻 成為我身體另一半。千金不換。它已熟悉我的汗。它 是我肩膀上的指環。偶也是信迷 hoho 裝個酷狗 盒 一艘就有了。...

CF手遊7號揹包怎麼使用更好 7號揹包作用解析

號揹包的推出大大解放了玩家在遊戲中對於槍械的選擇空間,玩家在購買全部個揹包之後,對於槍械的分配仍然要做到合理,才能發揮出號揹包的全部威力。在遊戲中玩家可以使用的主 大致可以分為機槍 散彈槍 步槍 狙擊槍 衝鋒槍個系列,這個系列主 可以應付在遊戲中各式各樣的槍械需求,因而在玩家把每個系列的主 分別裝備...

關於求極限lim 0 1 x n 1 xdx

實際上是可以採用中值定理的,只不過推導過程麻煩一點 用中值定理得出的解應該為 lim 0 1 x n 1 x dx lim 1 0 n n 1 n 因為 n具體取什麼值是由n決定的,所以分數上下的 值都應該寫作 n,如果要證明 lim 1 0 n n 1 n 0,則需要證明在取n趨向於無窮大的任意一...