Bone Collector II(01背包kth)
Posted zdragon1104
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bone Collector II(01背包kth)相关的知识,希望对你有一定的参考价值。
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 1
Sample Output
12 2 0
题目大意:
输入n,v,k分别代表n个物品,v的体积,以及要求v能装下第k大的价值。
01背包变形,加一维代表第几大,最后dp[v][k]即为答案。
#include <iostream> #include <cstring> using namespace std; int v[105],w[105]; int dp[1005][35],a[35],b[35]; int n,val,k; int main() { int T; cin>>T; while(T--) { memset(dp,0,sizeof dp); cin>>n>>val>>k; for(int i=1;i<=n;i++) cin>>v[i]; for(int i=1;i<=n;i++) cin>>w[i]; for(int i=1;i<=n;i++) for(int j=val;j>=w[i];j--) { for(int l=1;l<=k;l++) { a[l]=dp[j][l];///不取 b[l]=dp[j-w[i]][l]+v[i];//取 } a[k+1]=b[k+1]=-1; int x=1,y=1,z=1; while(z<=k&&(x<=k||y<=k))///更新,也可以直接排序 { if(a[x]>b[y]) dp[j][z]=a[x++]; else dp[j][z]=b[y++]; if(dp[j][z]!=dp[j][z-1]) z++; } } cout<<dp[val][k]<<‘ ‘; } return 0; }
以上是关于Bone Collector II(01背包kth)的主要内容,如果未能解决你的问题,请参考以下文章
背包专题A - Bone Collector II hdu2639 01背包的第k个最优解