博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-2639-Bone Collector II
阅读量:6657 次
发布时间:2019-06-25

本文共 1190 字,大约阅读时间需要 3 分钟。

链接:https://vjudge.net/problem/HDU-2639#author=Zxzz106

题意:

给v大的背包,n个物品的价值和体积,求能装下的第k大的价值是多少。

01背包,第k大。

思路:

dp数组多开一维记录从第一大到第k大的值。

内循环用两个数组记录使用当前物品和不使用当前物品的情况。

结束后将两个数组合并到dp数组中。

代码:

#include 
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int MAXN = 1e2 + 10;const int MAXV = 1e3 + 10;const int MAXK = 30 + 5;int dp[MAXV][MAXK];int a[MAXN];int b[MAXN];int A[MAXK];int B[MAXK];int main(){ int t; int n, v, k; scanf("%d", &t); while (t--) { memset(dp, 0, sizeof(dp)); scanf("%d%d%d", &n, &v, &k); for (int i = 1;i <= n;i++) scanf("%d", &a[i]); for (int i = 1;i <= n;i++) scanf("%d", &b[i]); for (int i = 1;i <= n;i++) for (int j = v;j >= b[i];j--) { for (int x = 1;x <= k;x++) { A[x] = dp[j - b[i]][x] + a[i]; B[x] = dp[j][x]; } A[k + 1] = -1; B[k + 1] = -1; int x, y, z; x = y = z = 1; //对得到的所有价值排序入队 while (x <= k && (A[y] != -1 || B[z] != -1)) { if (A[y] > B[z]) dp[j][x] = A[y++]; else dp[j][x] = B[z++]; if (dp[j][x] != dp[j][x - 1]) x++; } } printf("%d\n", dp[v][k]); } return 0;}

  

转载于:https://www.cnblogs.com/YDDDD/p/10464538.html

你可能感兴趣的文章
ALGO_53(蓝桥杯) 最小乘积
查看>>
bloom, Fake HDR, True HDR(转)
查看>>
【转】MySQL的各种timeout
查看>>
CString,string,char*,比较
查看>>
C#中Collection,List和ArrayList的区别
查看>>
web.py框架之高级应用
查看>>
操作一个虚拟鼠标
查看>>
如何自动以管理员身份运行.NET程序?
查看>>
IOS UTI统一类型标识符:判断文件类型通过后缀
查看>>
Python之面向对象
查看>>
DotNet(C#)自定义运行时窗体设计器Runtime FormDesigner(转载)
查看>>
SQL Server数据库中批量导入数据
查看>>
次短路问题总结
查看>>
swing时钟
查看>>
Linux下Tomcat日志分割
查看>>
GCC参数详解
查看>>
datagirdview自动跳一行选择显示,界面看板
查看>>
程序设计实习 02 第i位替换
查看>>
python基本数据类型
查看>>
服务器端车牌识别搭建
查看>>