hdu2639(01背包k优解)
来源:互联网 发布:网络交易监管系统 编辑:程序博客网 时间:2024/06/09 03:47
没怎么理解题意,
题意:有n件物品,背包体积为v,给出一行价值和一行花费,求第k优解,每个物品只能取一次。
思路:不考虑k优解,显然是个简单的01背包,1维的数组足够表示。即便要求k优解,在k<=30的条件下,此题再加1维也没什么好说的,用dp[j][k]表示背包体积为j时的k优解,一开始不知道怎么转移,原来无非是记录当前每种可能的解,然后从大到小插进数组就行了。时间复杂度就是o(nvk),最大也就3*10^6。
代码
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
- struct Node
- {
- int price;
- int val;
- } node[1005];
- int main()
- {
- int t;
- scanf("%d",&t);
- while(t--)
- {
- int n,v,k,i,dp[1005][31] = {0},a[31],b[31];
- scanf("%d%d%d",&n,&v,&k);
- for(i = 0; i<n; i++)
- scanf("%d",&node[i].price);
- for(i = 0; i<n; i++)
- scanf("%d",&node[i].val);
- int j;
- for(i = 0; i<n; i++)
- {
- for(j = v; j>=node[i].val; j--)
- {
- int cnt = 0,d;
- for(d = 1; d<=k; d++)//分别将放入第i个石头与不放第i个石头的结果存入a,b,数组之中
- {
- a[d] = dp[j-node[i].val][d]+node[i].price;
- b[d] = dp[j][d];
- }
- int x,y,z;
- x = y = z = 1;
- a[d] = b[d] = -1;
- while(z<=k && (x<=k || y<=k))//循环找出前K个的最优解
- {
- if(a[x] > b[y])
- {
- dp[j][z] = a[x];
- x++;
- }
- else
- {
- dp[j][z] = b[y];
- y++;
- }
- if(dp[j][z]!=dp[j][z-1])
- z++;
- }
- }
- }
- printf("%d\n",dp[v][k]);
- }
- return 0;
- }
阅读全文
0 0
- hdu2639(01背包k优解)
- hdu2639(01背包求第k优解)
- hdu2639 01背包第k优解
- hdu2639-01背包(第k大背包问题)
- hdu2639(01背包变形-第k大背包)
- hdu2639 Bone Collector II 01背包第K优解
- hdu2639 Bone Collector II--01背包K优解
- hdu2639 Bone Collector II(01背包第k优解)
- HDU2639:Bone Collector II(01背包第k优解)
- hdu2639(求价值第K大的01背包)
- hdu2639 Bone Collector II (01背包第k大解)
- HDU2639 Bone Collector II 背包K优解
- hdu2639背包问题第K优解
- HDU2639 01背包 第K优决策
- hdu2639(第k大值+01背包)
- HDU2639 01背包 第K优决策
- hdu2639(01背包的第K大)
- 01背包第k大价值hdu2639
- Java——变量类型
- Android -- Looper.prepare()和Looper.loop() —深入版
- ActiveMQ中的消息重发时间间隔和重发次数吗?
- 阶乘因式分解(一) (思维)
- linux系统缺少perl组建中的Data::Dumper模块
- hdu2639(01背包k优解)
- 爬虫学习笔记01(问题:Errno 10060)
- 集合框架体系结构,list、set操作数据,泛型(一)
- 权力的游戏 —— 台词与对白
- 七月英语月刊--心态
- 修改WordPress4.8后台底部版权信息
- useradd -g mysql mysql解析及useradd详解
- 常用的DOS命令
- java代理模式