hdu2639 01揹包k優解)

2021-08-04 16:08:07 字數 918 閱讀 4436

沒怎麼理解題意,

題意:有n件物品,揹包體積為v,給出一行價值和一行花費,求第k優解,每個物品只能取一次。

思路:不考慮k優解,顯然是個簡單的01揹包,1維的陣列足夠表示。即便要求k優解,在k<=30的條件下,此題再加1維也沒什麼好說的,用dp[j][k]表示揹包體積為j時的k優解,一開始不知道怎麼轉移,原來無非是記錄當前每種可能的解,然後從大到小插進陣列就行了。時間複雜度就是o(nvk),最大也就3*10^6。

**#include 

#include 

#include 

using

namespace

std;  

struct

node  

node[1005];  

intmain()  

,a[31],b[31];  

scanf("%d%d%d"

,&n,&v,&k);  

for(i = 0; i

scanf("%d"

,&node[i].price);  

for(i = 0; i

scanf("%d"

,&node[i].val);  

intj;  

for(i = 0; i

intx,y,z;  

x = y = z = 1;  

a[d] = b[d] = -1;  

while

(z<=k && (x<=k || y<=k))

//迴圈找出前k個的最優解

else

if(dp[j][z]!=dp[j][z-1])  

z++;  

}  }  

}  printf("%d\n"

,dp[v][k]);  

}  return

0;  

}  

hdu2639(01揹包變形 第k大揹包)

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 這兩個有序佇列...

dp之01揹包hdu2639(第k優解)

題意 給出一行價值,一行體積,讓你在v體積的範圍內找出第k大的值.注意,不要 和它的第一題混起來,它第一行是價值,再是體積 思路 首先dp i j 代表的是在體積為i的時候第j優解為dp i j 那麼,我們就可以這樣思考,i對應體積,那麼如果只是一維的dp i 代表的應該是體積為i時的最大值,那麼同...

dp之01揹包hdu2639(第k優解)

題意 給出一行價值,一行體積,讓你在v體積的範圍內找出第k大的值.注意,不要 和它的第一題混起來,它第一行是價值,再是體積 思路 首先dp i j 代表的是在體積為i的時候第j優解為dp i j 那麼,我們就可以這樣思考,i對應體積,那麼如果只是一維的dp i 代表的應該是體積為i時的最大值,那麼同...