HDOJ 题目2639Bone Collector II(01背包第k优解)
2014-09-02 16:15
169 查看
Bone Collector II
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2284 Accepted Submission(s): 1196
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
百万秦关终属楚
Recommend
teddy | We have carefully selected several similar problems for you: 3033 1561 1712 2844 1011
d[i][j][k], 表示取前i个物品,用j的费用,第k大价值是多少
在递推d[i][j][1...k]时,先获取上一个状态d[i-1][j][1...k]递推出来所有的值:
即集合A={dp[i-1][j][p]+w[i], 1<=p<=k}, 还有原来的值集合B={dp[i-1][j][p], 1<=p<=k}
然后把集合A和B中的前k大的值按从大到小顺序赋值给d[i][j][1...k]
ac代码
#include<stdio.h> #include<string.h> #include<stdlib.h> int a[110],b[110],dp[1100][1100],w[110],v[110]; int cmp(const void *a,const void *b) { return *(int *)b-*(int *)a; } int main() { int t; scanf("%d",&t); while(t--) { int n,m,r,i,j,k,na,nb,x,y,temp; scanf("%d%d%d",&n,&m,&r); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) { scanf("%d",&v[i]); } for(i=0;i<n;i++) scanf("%d",&w[i]); for(i=0;i<n;i++) { for(j=m;j>=w[i];j--) { na=0,nb=0; for(k=1;k<=r;k++) { //if(dp[j][k]) b[nb++]=dp[j][k]; //else a[na++]=dp[j-w[i]][k]+v[i]; } qsort(a,na,sizeof(a[0]),cmp);//a,b从大到小排 qsort(b,nb,sizeof(b[0]),cmp); x=0,y=0,k=1; while(k<=r&&(x<na||y<nb))//合并排序 { temp=0; if(y>=nb||(x<na&&a[x]>b[y])) { temp=a[x++]; } else temp=b[y++]; if(j==1||temp!=dp[j][k-1]) { dp[j][k]=temp; k++; } } } } printf("%d\n",dp[m][r]); } }
相关文章推荐
- HDOJ 题目分类
- HDOJ题目4705 Y(简单树形DP+数学)
- HDOJ 题目1595 find the longest of the shortest(枚举,最短路记录路径)
- HDOJ 题目1715 大菲薄数 大数
- HDOJ 1166 敌兵布阵 第一次用线段树AC题目
- HDOJ 题目1028Ignatius and the Princess III(母函数模板)
- HDOJ题目2516 取石子小游戏(博弈)
- hdoj 题目分类
- HDOJ 题目1466 计算直线的交点数(动态规划)
- HDOJ 题目4857 逃生(逆序拓扑排序,优先队列)
- HDOJ 题目1176 免费馅饼(动态规划)
- HDOJ 题目4607 Park Visit(树的直径)
- HDOJ 题目4738 Caocao's Bridges(双联通,求桥)
- HDOJ 题目2187 悼念512汶川大地震遇难同胞——老人是真饿了(贪心)
- hdoj 1017 A Mathematical Curiosity(再不看清题目我就是g)
- HDOJ 题目2208唉,可爱的小朋友(搜索,dfs)
- HDOJ 题目1087Super Jumping! Jumping! Jumping!(动态规划)
- HDOJ 题目2189悼念512汶川大地震遇难同胞——来生一起走(母函数)
- HDOJ题目1220 Cube(组合数学)
- HDOJ题目2095find your present (2)(数学,异或消除)