【HDU - 2639】Bone Collector II (第K大背包,dp,STLset)
題干:
The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup" competition,you must have seem this title.If you haven't seen it before,it doesn't matter,I will give you a link:?
Here is the link:?http://acm.hdu.edu.cn/showproblem.php?pid=2602?
Today we are not desiring the maximum value of bones,but the K-th maximum value of the bones.NOTICE that,we considerate two ways that get the same value of bones are the same.That means,it will be a strictly decreasing sequence from the 1st maximum , 2nd maximum .. to the K-th maximum.?
If the total number of different values is less than K,just ouput 0.
Input
The first line contain a integer T , the number of cases.?
Followed by T cases , each case three lines , the first line contain two integer N , V, K(N <= 100 , V <= 1000 , K <= 30)representing the number of bones and the volume of his bag and the K we need. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.?
Output
One integer per line representing the K-th maximum of the total value (this number will be less than 2?31).?
Sample Input
3 5 10 2 1 2 3 4 5 5 4 3 2 1 5 10 12 1 2 3 4 5 5 4 3 2 1 5 10 16 1 2 3 4 5 5 4 3 2 1Sample Output
12 2 0題目大意:
01背包的第k個最大價值。注意,兩種不同方法得到相同價值是算作同一個種。這意味著,可以得到的價值序列將是一個嚴格遞減的序列,從第1個最大值,第2個最大值.....第k個最大值。?
如果不同值的總數小于K,就輸出"0"(不帶引號)
解題報告:
直接用set維護前k大就可以了。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define FF first #define SS second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 2e5 + 5; set<int> dp[1005]; int n,V,K; int w[MAX],v[MAX]; int main() {int T;cin>>T;while(T--) {cin>>n>>V>>K;for(int i = 0; i<=V; i++) dp[i].clear(),dp[i].insert(0);for(int i = 1; i<=n; i++) scanf("%d",v+i);for(int i = 1; i<=n; i++) scanf("%d",w+i);for(int i = 1; i<=n; i++) {for(int j = V; j>=w[i]; j--) {auto it = dp[j-w[i]].begin();for(;it!=dp[j-w[i]].end(); it++) {dp[j].insert(*it + v[i]);}while(dp[j].size() > K) dp[j].erase(dp[j].begin());}}printf("%d\n",*dp[V].begin());}return 0 ; }?
總結
以上是生活随笔為你收集整理的【HDU - 2639】Bone Collector II (第K大背包,dp,STLset)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spools.exe - spools是
- 下一篇: 华为帝瓦雷调音耳机还得接着等:曝Free