http://hi.baidu.com/chenyun00/blog/item/f1c7ae545e9e2a491138c26b.html
#include<cstdio>
#include<iostream>
using namespace std;
int val[105],vol[105];
int dp[1005][50],A[50],B[50];
int main()
{
int t;
int i,j,q;
cin>>t;
while(t--)
{
int n,m,k;
int a,b,c;
cin>>n>>m>>k;
for(i=1;i<=n;i++)
cin>>val[i];
for(i=1;i<=n;i++)
cin>>vol[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=m;j>=vol[i];j--)
{
for(q=1;q<=k;q++)
{
A[q]=dp[j-vol[i]][q]+val[i];
B[q]=dp[j][q];
}
A[q]=B[q]=-1;
a=b=c=1;
while(c<=k&&(A[a]!=-1||B[b]!=-1))//排序 然后装进去
{
if(A[a]>B[b])
dp[j][c]=A[a],a++;
else
dp[j][c]=B[b],b++;
if(dp[j][c]!=dp[j][c-1])//判断是否相同
c++;
}
}
cout<<dp[m][k]<<endl;
}
return 0;
}
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int val[105],vol[105];
int dp[1005][50],A[50];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int t;
int i,j,q;
cin>>t;
while(t--)
{
int n,m,k;
int a;
cin>>n>>m>>k;
for(i=1;i<=n;i++)
cin>>val[i];
for(i=1;i<=n;i++)
cin>>vol[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=m;j>=vol[i];j--)
{
for(q=1;q<=k;q++)
{
A[2*q-1]=dp[j-vol[i]][q]+val[i];
A[2*q]=dp[j][q];
}
sort(A+1,A+2*k+1,cmp);
a=1;
for(q=1;q<=2*k&&a<=k;q++)
{
dp[j][a]=A[q];
if(dp[j][a]!=dp[j][a-1])
a++;
}
}
cout<<dp[m][k]<<endl;
}
return 0;
}