码迷,mamicode.com
首页 > 其他好文 > 详细

Bone Collector II(hdu 2639)

时间:2016-08-11 22:33:06      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

题意:求01背包的第k最优值

输入:第一行为T,下面是T组数据,每组数据有n,m,k 代表n件物品,m容量,和题目要求的k,下一行是n个物品的价值,再一行是n个物品的体积

输出:T行答案

技术分享
/*
  类似于归并排序中合并的做法,对于f[i][j]的k个最优值,从f[i-1][j]和f[i-1][j-w[i]]+v[i]
  的k个最优值中选出最优的k个放入 
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 110
#define M 1010
using namespace std;
int f[M][N/3],v[N],w[N],x[M],y[M],n,m,k;
int read()
{
    char c=getchar();int num=0;
    while(c<0||c>9){c=getchar();}
    while(c>=0&&c<=9){num=num*10+c-0;c=getchar();}
    return num;
}
void work()
{
    n=read();m=read();k=read();
    for(int i=1;i<=n;i++)
      v[i]=read();
    for(int i=1;i<=n;i++)
      w[i]=read();
    for(int i=1;i<=n;i++)
      for(int j=m;j>=w[i];j--)
      {
          for(int l=1;l<=k;l++)
            x[l]=f[j][l],y[l]=f[j-w[i]][l]+v[i];
          int s1=1,s2=1,s3=1;
          x[k+1]=y[k+1]=-1;
          while((x[s1]!=-1||y[s2]!=-1)&&s3<=k)
          {
              if(x[s1]>y[s2])f[j][s3]=x[s1++];
              else f[j][s3]=y[s2++];
              if(f[j][s3]!=f[j][s3-1])s3++;
          }
      }
    printf("%d\n",f[m][k]);
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        memset(f,0,sizeof(f));
        work();
    }
    return 0;
}
View Code

 

Bone Collector II(hdu 2639)

标签:

原文地址:http://www.cnblogs.com/harden/p/5762684.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!