HDU2693 骨头收藏家II(第k大背包)
2017-11-19 20:29
363 查看
【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=2639
http://acm.hdu.edu.cn/showproblem.php?pid=2639
题目意思
给你n种骨头,每种骨头占用对应的空间,却有相应的价值。现在你有v的背包,问第k大的价值是多少(相同价值只算一次)解题思路
第k大背包题,处理下值相同情况就可以了代码部分
#include <bits/stdc++.h> using namespace std; #define LL long long const int maxn=105; const int INF=0x3f3f3f; LL dp[35][1005],p1[35],p2[35]; int w[maxn],v[maxn]; int main() { int t; scanf("%d",&t); while(t--) { int n,m,k; scanf("%d %d %d",&n,&m,&k); /*for (int i=1;i<=k;i++) for (int j=0;j<=m;j++) if (i==1) dp[i][j]=0; else dp[i][j]=-INF;*/ memset(dp,0,sizeof(dp)); for (int i=1; i<=n; i++) scanf("%d",&w[i]); for (int i=1; i<=n; i++) scanf("%d",&v[i]); for (int i=1; i<=n; i++) { for (int j=m; j>=v[i]; j--) { for (int z=1; z<=k; z++) { p1[z]=dp[z][j]; p2[z]=dp[z][j-v[i]]+w[i]; } int h1=1,h2=1,h=1; while(h<=k&&(h1<=k||h2<=k)) { if (p1[h1]>p2[h2]&&h1<=k||h2>k) ///必须判断h1和h2 { if (p1[h1]!=dp[h-1][j]) ///如果不等于前个价值 dp[h++][j]=p1[h1]; h1++; } else { if (p2[h2]!=dp[h-1][j]) dp[h++][j]=p2[h2]; h2++; } } } } printf("%d\n",dp[k][m]); } return 0; }
相关文章推荐
- HDU 2639 Bone Collector II (01背包求第K大解)
- 第k大值01背包问题
- hdu 2639 (Bone Collector II) 0-1背包的第k优解
- HDU 2639(第K大背包)
- 背包问题--求第K大值
- hdu2639----求第k大01背包模板题
- HDU 2639 01背包求第k大
- SDUTOJ 3307 (01背包求第K大)
- HDU-2639 Bone Collector II (01背包 找第k优解 入门题)
- 背包问题求第K优解
- rqnoj-123-多人背包-第K最优解(好题)
- 背包问题小总结 习题(动态规划01背包(第k优解)完全背包,多重背包)acm杭电HDU2639,HDU2602,HDU1114,HDU2191
- 背包求第k优解 vijos 1412
- 4000 hdu2639(01背包变形-第k大背包)
- HDU 2639(Bone Collector II)背包问题求第K优解
- 背包问题第k优解
- HDU 2639 Bone Collector II (求第K大的背包)
- hdu2639背包问题第K优解
- RQNOJ_123 多人背包 【背包第K优解】
- hdu 2639Bone Collector II(01背包求第k大)