HDOJ 2639 Bone Collector II(01||第K大背包)
2015-09-10 17:05
302 查看
题目大意:
给定3个数n,m,k,分别代表有n个骨头,m大的背包,求解第k大的价值。
以下两行分别代表,价值和体积。
思路:定义两个数组a,b来分别存dp[j-v[i]][t]+p[i],和dp[j][t],其中dp[j][t],代表体积为j的包能装的第t大价值。
最后再合并到dp数组中,求解前K大只需要将前K个数求解出来,放入dp中。
给定3个数n,m,k,分别代表有n个骨头,m大的背包,求解第k大的价值。
以下两行分别代表,价值和体积。
思路:定义两个数组a,b来分别存dp[j-v[i]][t]+p[i],和dp[j][t],其中dp[j][t],代表体积为j的包能装的第t大价值。
最后再合并到dp数组中,求解前K大只需要将前K个数求解出来,放入dp中。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<math.h> #include<queue> #define ll long long #define inf 1000010+10 using namespace std; int p[1010],v[1010],a[1010],b[1010]; int dp[1010][1010]; int main() { int n,m,i,j,k; int cla; scanf("%d",&cla); while(cla--) { scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n;i++) scanf("%d",&p[i]); for(i=1;i<=n;i++) scanf("%d",&v[i]); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { for(j=m;j>=v[i];j--) { for(int t=1;t<=k;t++) { a[t]=dp[j][t]; b[t]=p[i]+dp[j-v[i] ][t]; } a[k+1]=b[k+1]=-1;//注意不要漏掉 int x=1,y=1,z=1; while(z<=k&& (x<=k||y<=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[m][k]); } return 0; }
相关文章推荐
- Java 设计模式——单例模式
- iBeacon 创建一个UUID
- GDB 支持多线程调试
- 动态数组new、allocate
- 编译OpenWRT过程问题解决
- crontab 定时运行python程序遇到的一个错误
- HDU 4763 Theme Section
- POJ - 1258 Agri-Net(最小生成树简单题)
- 「分而治之」化大为小
- 极易理解的红黑树讲解
- Centos下重要日志文件及查看方式
- WPF 确认动态加载数据完成
- svn 命令行下常用的几个命令
- CSplitterWnd窗口分割之——动态静态嵌套分割(二)
- js取url的参数
- jquery的showLoading遇到的奇葩问题--正在查询
- 30款高质量的HTML5和CSS3响应式模板
- Connector/c++ 查询Mysql,出现 can't fetch because not on result set 错误
- Android Cursor类的概念和用法
- FZU 1901 Period II