01背包变种。可惜写的时候有个变量写错了检查了一晚上,被坑惨了,以后变量名可要注意了。
#include<iostream>
#include<cstring>
using namespace std;
int A[33];
int B[33];
int dp[1005][33];
int value[105],weight[105];
int main()
{
int t,n,i,v,k,j,kk,traget;
cin>>t;
while(t--)
{
cin>>n>>v>>k;
for(i=1;i<=n;i++)
cin>>value[i];
for(i=1;i<=n;i++)
cin>>weight[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
for(j=v;j>=weight[i];j--)
{
for(kk=1;kk<=k;kk++)
{
A[kk]=dp[j][kk];
B[kk]=dp[j-weight[i]][kk]+value[i];
}
A[kk]=-1;
B[kk]=-1;
int a,b,c;
a=b=c=1;
while(c<=k&&(A[a]!=-1||B[b]!=-1))
{
if(A[a]>B[b])
{
dp[j][c]=A[a];
a=a+1;
}
else {
dp[j][c]=B[b];
b=b+1;
}
if(dp[j][c]!=dp[j][c-1])
c=c+1;
}
}
}
cout<<dp[v][k]<<endl;
}
return 0;
}