01背包第k大
来源:互联网 发布:淘宝里面的关键词检索 编辑:程序博客网 时间:2024/04/30 14:13
嗯……这道题其实还是挺简单的……
然后我就不会做了QAQ
实际上就是设
f[i][j][k]为第i个物品,容量为j,第k个背包的价值。
那么则有f[i][j][p] =
f[i - 1][j - w[i]][1…K] + val[i]与f[i - 1][j][1…K]的第p个
然后因为我懒了一下……
我想:
诶?询问最大值?
前k大?
然后搞了个堆下来……
然后就TLE了TAT
(话说我好像用堆就从来没有用对过……
#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <iostream>#define Rep(i,n) for(int i = 1;i <= n;i ++)#include <queue>#define CLR(a,b) memset(a,b,sizeof(a))using namespace std;int K,n,m,f[5005][55],val[205],w[205];void Merge(int now,int hv){ int tmp[105]; int a = 1,b = 1,cnt = 0; while(a <= K && b <= K) { if(f[hv][a] > f[hv - w[now]][b] + val[now]) tmp[++ cnt] = f[hv][a ++]; else tmp[++ cnt] = f[hv - w[now]][b ++] + val[now]; } Rep(i,K)f[hv][i] = tmp[i];}int main (){ scanf("%d%d%d",&K,&m,&n); Rep(i,n) scanf("%d%d",&w[i],&val[i]); CLR(f,-127); f[0][1] = 0; Rep(i,n) { for(int j = m;j >= w[i];j --) Merge(i,j); } int ans = 0; Rep(i,K)ans += f[m][i]; printf("%d\n",ans); return 0;}
0 0
- 01背包第k大
- hdu2639(第k大值+01背包)
- hdu2639(01背包的第K大)
- 01背包第k大价值hdu2639
- hdu2639-01背包(第k大背包问题)
- hdu2639(01背包变形-第k大背包)
- hdu2639(求价值第K大的01背包)
- hdu2639----求第k大01背包模板题
- HDU2639 - Bone Collector II(第k大01背包)
- SDUTOJ 3307 (01背包求第K大)
- HDU - 2639 Bone Collector II(第K大01背包)
- hdu 2639 Bone Collector II 第k大01背包
- N题 第K大背包
- HDU 2639 第K大背包问题
- 背包问题--求第K大值
- 01背包 第k优解
- 01背包 第k优解
- hdu2639 Bone Collector II 01背包边形,第k大价值
- C++程序设计必知:生存期
- equals 与hashCode 的关系
- Dubbo源码分析(三):自定义Schema--基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)
- HDU 2896 AC自动机
- 关于udev,sys,proc,tmpfs一些定义的问题
- 01背包第k大
- Spring基础 注解实现Bean依赖注入
- 关于ubuntu在使用apt-get update时Hash Sum mismatch的解决方法
- android使用butterknife InjectView和BindView
- 学习下 linux
- Spring 声明式事务配置管理方法
- Linux入门操作小技巧(持续更新)
- Spring基础 Quartz的配置
- 如何用Eclipse把第三方Jar打到Jar里,做成FatJar(包含Eclipse插件安装失败的解决办法)