记忆化搜索:
#include"iostream"
#include"algorithm"
using namespace std;
int volume[1200];
int value[1200];
int n,v;
int f[1200][1200];
int solve(int id,int cap)
{
if(f[id][cap]!=-1)
return f[id][cap];
else
{
int res;
if(id==n)
res=0;
else if(volume[id]>cap)
res=solve(id+1,cap);
else
res=max(solve(id+1,cap),solve(id+1,cap-volume[id])+value[id]);
f[id][cap]=res;
return f[id][cap]=res;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>v;
memset(f,-1,sizeof(f));
for(int i=0;i<n;i++)
cin>>value[i];
for(int i=0;i<n;i++)
cin>>volume[i];
cout<<solve(0,v)<<endl;
}
return 0;
}
#include"iostream"
#include"algorithm"
using namespace std;
const int volume=20000;
const int num=2000;
int main()
{
//freopen("a.txt","r",stdin);
int T,N,V;
int i,v;
int f[volume];
int c[num];
int w[num];
cin>>T;
while(T--)
{
cin>>N>>V;
memset(c,0,sizeof(c));
memset(w,0,sizeof(w));
memset(f,0,sizeof(f));
for(i=1;i<=N;i++)
{
cin>>w[i];
}
for(i=1;i<=N;i++)
{
cin>>c[i];
}
for(i=1;i<=N;i++)
{
for(v=V;v>=c[i];v--)
if(f[v-c[i]]+w[i]>f[v])//if(max(f[v],f[v-c[i]]+w[i])>f[v])
f[v]=f[v-c[i]]+w[i];
}
cout<<f[V]<<endl;
}
return 0;
}