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

2021-09-06 11:04:50 字數 887 閱讀 2524

題意:給出一行價值,一行體積,讓你在v體積的範圍內找出第k大的值.......(注意,不要 和它的第一題混起來,它第一行是價值,再是體積)

思路:首先dp[i][j]代表的是在體積為i的時候第j優解為dp[i][j]......那麼,我們就可以這樣思考,i對應體積,那麼如果只是一維的dp[i],代表的應該是體積為i時的最大值,那麼同理,dp[i][1]代表的是體積為i時的最大值,那麼我們就可以退出兩種動態,dp[i][m],dp[i-s[i][0]][m]+s[i][1].....然後把這兩種狀態開個兩個陣列分別儲存起來,再合併出體積為i時的前k優解......依次後推,直到dp[v][k].......

#include#include#include#include#includeusing namespace std;

#define max(x,y) x>y? x:y

typedef int ss;

ss dp[1005][100],s[1005][2];

ss a[50],b[50];

int main()

for(int i=1;i<=n;i++)

int x=1,y=1,w=1;

a[k+1]=b[k+1]=-1; //這個地方要注意,因為有可能a或者b陣列先比較完

while(w<=k&&(x<=k||y<=k))

else

if(w==1||dp[j][w]!=dp[j][w-1]) //這是去重.....

w++;

//printf("111\n");}}

}//for(int i=1;i<=k;i++)

printf("%d\n",dp[v][k]);

} return 0;

}

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

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

hdu 2639 第k大01揹包

求每個狀態裡的k優解,然後合併 hdu 2639 求01揹包的第k大解。合併兩個有序序列 include include include include using namespace std const int maxn 110 int dp 1010 50 dp i j 表示容量為i,第j大的值...

hdu 2639 第k小的01揹包

題意 第k小的01揹包,重複的選項算乙個 我們年紀一共10個班,如果我想知道年紀第一,我需要知道每個班級的第一名,一比較,那麼我就知道年紀第一是誰了 如果我要知道年紀前十名,那麼,我只要知道每個班的前10名,那麼我比較之後就知道了年級的前十名 dp i j 表示體積為i時,價值為第j大的價值,每次選...