hdu 2639 Bone Collector II (01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2639
题意:给你一些Bone和一个背包体积,求第K大的价值;
思路:采用了三维的数组第三维是存(1-k)大的值的:
View Code
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int val[120],vv[120];
int ans[1200][120],a[120],b[120];
int main()
{
int q,n,v,k,i,j;
scanf("%d",&q);
while(q--)
{
scanf("%d%d%d",&n,&v,&k);
for(i=1;i<=n;i++)
scanf("%d",&val[i]);
for(i=1;i<=n;i++)
scanf("%d",&vv[i]);
memset(ans,0,sizeof(ans));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=1;i<=n;i++)
for(j=v;j>=vv[i];j--)
{
for(int f=1;f<=k;f++)
{
a[f]=ans[j-vv[i]][f]+val[i];
b[f]=ans[j][f];
}
int x,y,z;
x=y=z=1;
while(z<=k&&(x<=k||y<=k))
{
if(a[x]<=b[y]) //这里有个问题,用a[x]<b[y] 结果就不正确,ORz,或者用sort先排一下序也可以(当然必须存到一个数组中);
ans[j][z]=b[y],y++;
else
ans[j][z]=a[x],x++;
if(ans[j][z-1]!=ans[j][z])
z++;
}
}
printf("%d\n",ans[v][k]);
}
return 0;
}