第k优解 hdu 2639
#include<iostream> #include<cstdio> #include<cstring> #define maxn 110 using namespace std; int w[110],v[110],f[1010][110],a[110],b[110]; //f[j][k]表示重量为j时的第k优解 int main() { int t; scanf("%d",&t); while(t--) { int n,m,i,j,k,l; scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n;i++) scanf("%d",&v[i]); for(i=1;i<=n;i++) scanf("%d",&w[i]); memset(f,0,sizeof(f)); for(i=1;i<=n;i++) { for(j=m;j>=w[i];j--) { for(l=1;l<=k;l++) { a[l]=f[j-w[i]][l]+v[i]; b[l]=f[j][l]; } //f[v]这个有序队列是由f[v]和f[v-c[i]]+w[i]这两个有序队列得到 a[k+1]=b[k+1]=-1; int x=1,y=1,z=1; while(z<=k&&(a[x]!=-1||b[y]!=-1)) { if(a[x]>b[y]) { f[j][z]=a[x]; x++; } else { f[j][z]=b[y]; y++; } if(f[j][z]!=f[j][z-1])//去重 z++; } } } printf("%d\n",f[m][k]); } return 0; }