HDOJ 2639 Bone Collector II(01背包第k优解)

原创 2016年08月29日 12:36:55

Bone Collector II

Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4198    Accepted Submission(s): 2184


Problem Description
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 231).
 

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
 

Author
teddy
 

Source


思路:
一道典型的01背包第k优解问题,就是在01背包装最大价值的基础上,问你装的第k大价值是多少。在01背包中,dp[j]=max{dp[j-v[i]]+w[i],dp[j-1]},所以我们只需要把每种状态的这两个值分别记下来,然后对于每个dp[j]的所有前k大解的可能取值进行排序,从中选取第k大的值即可。套用模板。


代码:
[cpp] view plain copy
  1. #include<cstdio>  
  2. #include<cstdlib>  
  3. #include<cstring>  
  4. #include<iostream>  
  5. using namespace std;  
  6.   
  7. int v[1001];  
  8. int w[1001];  
  9. int dp[1001][1001];  
  10. int a[1000],b[1000];   
  11. int d;    
  12.   
  13. int main()  
  14. {  
  15.     //freopen("in.txt","r",stdin);  
  16.     int T;  
  17.     scanf("%d",&T);  
  18.     while(T--)  
  19.     {  
  20.         memset(dp,0,sizeof(dp));  
  21.                 memset(a,0,sizeof(a));  
  22.                 memset(b,0,sizeof(b));  
  23.         int n,V,k;  
  24.         scanf("%d%d%d",&n,&V,&k);  
  25.         for(int i=1;i<=n;i++)  
  26.         {  
  27.             scanf("%d",&w[i]);  
  28.         }  
  29.         for(int i=1;i<=n;i++)  
  30.         {  
  31.             scanf("%d",&v[i]);  
  32.         }  
  33.         for(int i =1;i<=n;i++)    
  34.         {    
  35.             for(int j = V;j>=v[i];j--)    
  36.             {    
  37.                 for(d = 1;d<=k;d++)    
  38.                 {    
  39.                     a[d] = dp[j-v[i]][d] +w[i];    
  40.                     b[d] = dp[j][d];    
  41.                 }    
  42.                 int x =1;  
  43.                 int y = 1;  
  44.                 int z = 1;    
  45.                 a[d] = b[d] = -1;    
  46.                 while(z<=k && (x<=k || y<=k))    
  47.                 {    
  48.                     if(a[x]>b[y])    
  49.                     dp[j][z] = a[x++];    
  50.                     else    
  51.                     dp[j][z] = b[y++];    
  52.                     if(z==1||(dp[j][z]!=dp[j][z-1]))    
  53.                     z++;    
  54.                 }    
  55.             }    
  56.         }    
  57.         printf("%d\n",dp[V][k]);  
  58.     }  
  59.     return 0;  
  60. }   
版权声明:本博客为博主编程日记,转载请注明来源。

再谈01背包--01背包第k优解

普通的01背包如果已经搞得很明白的话,这个应该很好懂。。具体原理已经附在代码开头,这里就不说了。。 Type1:直接求第k优解的裸题。。HDU2639 Bone Collector II ...
  • u012350533
  • u012350533
  • 2013年10月06日 23:18
  • 1404

用优先队列式分支限界法解决0-1背包问题

用优先队列式分支限界法解决0-1背包问题的算法思想: 1.分支限界法常以广度优先或最小耗费优先(最大效益优先)方式搜索问题的解空间树, 对于0-1背包问题的解空间树是一个颗子集树。 2.在分支限界法中...
  • qq_24059821
  • qq_24059821
  • 2016年04月26日 20:28
  • 6759

贪心算法_01背包问题_Java实现

什么是贪心算法?是指在对问题进行求解时,总是做出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所得出的结果仅仅是某种意义上的局部最优解。因此贪心算法不会对所有问题都能得到整体最优解,但对于很...
  • ljmingcom304
  • ljmingcom304
  • 2015年12月15日 09:41
  • 4362

hdu 2639 Bone Collector II (01背包,第k优解问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639 解题报告:关于第k优解得问题,前面看到过第k最小生成树,不过很伤心,一直没看懂其思想 ...
  • ren_hui
  • ren_hui
  • 2013年07月31日 09:49
  • 562

HDU-2639-Bone Collector II(01背包的第k优解)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639 Bone Collector II Problem Description The ti...
  • m0_37345402
  • m0_37345402
  • 2017年07月29日 13:48
  • 163

Bone Collector II (HDU_2639) 01背包 + 第K优解

Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other...
  • Keeping111
  • Keeping111
  • 2016年03月06日 00:19
  • 230

hdu2639Bone Collector II (01背包,求第k优解)

Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in the ...
  • u010372095
  • u010372095
  • 2013年11月21日 21:44
  • 946

hdu 2639 Bone Collector II 01背包第K优解

点击打开链接链接 Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768...
  • qq_16843991
  • qq_16843991
  • 2014年10月26日 18:52
  • 390

hdu-2639-01背包变形之求第k优解-Bone Collector II

Bone Collector II Problem Description The title of this problem is familiar,isn't it?yeah,if you...
  • lele_pipi
  • lele_pipi
  • 2015年01月28日 12:28
  • 239

Hdu 2639 Bone Collector II (01背包第k优解)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639 思路:01背包第k优解。 #include #include int f[1005][...
  • whyorwhnt
  • whyorwhnt
  • 2013年03月07日 18:33
  • 743
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDOJ 2639 Bone Collector II(01背包第k优解)
举报原因:
原因补充:

(最多只允许输入30个字)