ZOJ 2639 01背包

来源:互联网 发布:mac桌面添加天气 编辑:程序博客网 时间:2024/05/16 18:37

求第K优解



#include<iostream>

#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int  t,n,v,k,K;
    int  f[1010][35];
    int  value[110],volum[110];
    int   a[35],b[35];
    int   x,y,z;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&v,&K);
        for(int  i=1;i<=n;i++)
                cin>>value[i];
        for(int  j=1;j<=n;j++)
                cin>>volum[j];
                memset(f,0,sizeof(f));
        for(int  i=1;i<=n;i++)
             for(int j=v;j>=volum[i];j--)
                   {
                     for(k=1;k<=K;k++  )
                          {
                              a[k]=f[j-volum[i]][k]+value[i];
                              b[k]=f[j][k];
                          }
                          a[k]=b[k]=-1;
                          x=y=z=1;
                          while(z<=k&&(a[x]!=-1||b[y]!=-1))      //忘了里面的括号,导致测试用例都一样,但是就是A不了
                          {
                              if(a[x]>b[y])
                                      f[j][z]=a[x++];
                             else
                                     f[j][z]=b[y++];
                             if(f[j][z]!=f[j][z-1])
                                    z++;
                          }
                 }
     cout<<f[v][K]<<endl;
   }
   return 0;
}
原创粉丝点击