沒怎麼理解題意,
題意:有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時的最大值,那麼同...