HDU 2639 第K大背包问题
2024-09-02 05:38:53
//状态方程和01背包类似,dp[j][k]表示背包容量为j的第k大背包的值。。。。。。。。。。 //应当注意的是此时dp[j][1.....k]应当是递减的。。。。。。。。。。。。。。。。。。。。 #include<stdio.h> #include<string.h>
#define Max(x,y) (x>y?x:y)
#define max_v 1000+10
#define max_k 30+5
#define max_n 100+5 int dp[max_v][max_k],w[max_n],c[max_n];
int q1[max_k],q2[max_k]; int main(){
int t;
scanf("%d",&t);
while(t--){
int n,v,k;
scanf("%d%d%d",&n,&v,&k);
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
scanf("%d",&w[i]);
}
for(int i=;i<=n;i++){
scanf("%d",&c[i]);
}
for(int i=;i<=n;i++){
for(int j=v;j>=c[i];j--){
for(int kk=;kk<=k;kk++){
q1[kk]=dp[j-c[i]][kk]+w[i];
q2[kk]=dp[j][kk];
}
q1[k+]=q2[k+]=-;
int h=,h1=,h2=;
while(h<=k&&(h1<=k||h2<=k)){
if(q1[h1]>q2[h2]){
dp[j][h]=q1[h1];
h1++;
}
//else if(q1[h1]<q2[h2]){
else{
dp[j][h]=q2[h2];
h2++;
}
if(dp[j][h]!=dp[j][h-]){
h++;
}
}
}
}
// for(int i=1;i<=k;i++){
// printf("%d ",dp[v][i]);
// }
// puts("");
printf("%d\n",dp[v][k]);
}
}
最新文章
- ASP.NET 5运行时升级到Beta5
- Effective C++ 34 区分接口继承和实现继承
- CAS 4.0.0RC编译环境
- POJ 3259 Wormholes【Bellman_ford判断负环】
- C#中dynamic的正确用法 以及 typeof(DynamicSample).GetMethod(";Add";);
- 402. Remove K Digits
- Poj 3667
- 独立硬盘冗余阵列与HDFS
- 微软开源PowerShell并支持Linux和OS X
- Mac Outlook数据文件的位置
- java中Log4J的使用笔记
- 设置IIS下PHP环境的DOCUMENT_ROOT
- 第三次冲刺spring会议(第五次会议)
- git 利用分支概念实现一个仓库管理两个项目
- 一文让你彻底理解 Java NIO 核心组件
- Collections斗地主案例
- css和javascript代码写在页面中的位置说明
- oracle删除表字段和oracle表增加字段
- Kubernetes总结
- [转]git学习------>;git-rev-parse命令初识