这是一道全裸的01背包,好像除了可能测试数据中存在有价值但是耗费为0的数据,其他的就是套用01背包的模板就能过了。有两个代码,一个是用二维数组,另一个是一维数组,二维的比较好理解,一维的空间复杂度较小,各有所长。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int max(int a,int b)
{
return a>b? a:b;
}
int t,cost[1100],value[1100],dp[1100];
int main()
{
scanf("%d",&t);
while(t--)
{
int n,v;
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++)
scanf("%d",&value[i]);
for(int i=1;i<=n;i++)
scanf("%d",&cost[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=v;j>=0;j--)
{
if(j>=cost[i])
dp[j]=max(dp[j],dp[j-cost[i]]+value[i]);
else
dp[j]=dp[j];
// cout<<dp[j]<<" ";
}
// cout<<endl;
}
cout<<dp[v]<<endl;
}
return 0;
}
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int max(int a,int b)
{
return a>b? a:b;
}
int t,cost[1100],value[1100],dp[1100][1100];
int main()
{
scanf("%d",&t);
while(t--)
{
int n,v;
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++)
scanf("%d",&value[i]);
for(int i=1;i<=n;i++)
scanf("%d",&cost[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=0;j<=v;j++)
{
if(j>=cost[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-cost[i]]+value[i]);
else
dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n][v]<<endl;
}
return 0;
}