hdu 2639

0/1背包问题,只是对于每一个volume保留前k个值,

View Code

Problem : 2639 ( Bone Collector II )     Judge Status : Accepted
RunId : 5569215    Language : C++    Author : billforum
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int value[1005],volume[1005];
int f[1005][50],A[50],B[50];
int n,v,k;

void dp()
{
    int i,j,q,a,b,c;
    memset(f,0,sizeof(f));
    for(i=1;i<=n;i++)
        for(j=v;j>=volume[i];j--)
        {
           for(q=1;q<=k;q++)
           {
              A[q]=f[j-volume[i]][q]+value[i];  //选取新队列A
              B[q]=f[j][q];                             //选取新队列B
           }
           A[q]=-1;B[q]=-1;            //把A、B的第k+1个元素标记为-1
           a=b=c=1;
           while(c<=k&&(A[a]!=-1||B[b]!=-1))   //合并A、B两个有序队列,并赋给有序队列f[j][1...k]
           {
                  if(A[a]>B[b])
                  f[j][c]=A[a],a++;
                  else
                  f[j][c]=B[b],b++;
                  if(f[j][c]!=f[j][c-1])                 c++;
           }
        }
    cout<<f[v][k]<<endl;
}

int main()
{
    //freopen("in.txt","r",stdin);
    int t,i;
    cin>>t;
    while(t--)
    {
        cin>>n>>v>>k;
        for(i=1;i<=n;i++)
            cin>>value[i];
        for(i=1;i<=n;i++)
            cin>>volume[i];
        dp();
    }

    return 0;
}
posted @ 2012-03-17 16:08  wuzhibin  阅读(559)  评论(0)    收藏  举报