#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
int T,N,V,f[1001],vol[1001],val[1001] ,tem;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&N,&V);
for(int i = 0 ; i < N ; i++)
scanf("%d",&val[i]);
for(i = 0 ; i < N ; i++)
scanf("%d",&vol[i]);
memset(f,0,sizeof(f));
for(i = 0 ; i < N ; i++)
{
for(int j = V ; j >= vol[i]; j--)
{
tem = f[j-vol[i]]+val[i];
if(f[j]<tem)
f[j] = tem;
}
}
cout<<f[V]<<endl;
}
return 0;
}
以上是01背包用二维数组解的源代码
#include <iostream>
using namespace std;
int Max(int x,int y)
{
return x>y?x:y;
}
int n,v;
int f[1001];
void zero(int cost,int weight)
{
for(int j=v;j>=cost;j--)
f[j]=Max(f[j],f[j-cost]+weight);
}
int main()
{
int w[1001],value[1001];
int test;
cin>>test;
while(test--)
{
cin>>n>>v;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
cin>>value[i];
for(i=1;i<=n;i++)
cin>>w[i];
for(i=1;i<=n;i++)
zero(w[i],value[i]);
cout<<f[v]<<endl;
}
return 0;
}
以上是一维加优化!!!!