01背包模板题
有N件物品和一个容量为V的背包, 每种物品均只有一件。第i件物品的费用是vo[i],价值是va[i]。求解将哪些物品装入背包可使价值总和最大。
状态方程是
dp[i][j]=Max(dp[i-1][j],dp[i-1][j-vo[i]]+va[i]);
空间优化后
dp[j]=Max(dp[j],dp[j-vo[i]]+va[i])
#include<iostream>
#include <cstring>
using namespace std;
#define Size 1111
int va[Size],vo[Size];
int dp[Size];
int Max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int t,n,v;
int i,j;
cin>>t;
while(t--)
{
cin>>n>>v;
for(i=1;i<=n;i++)
cin>>va[i];
for(i=1;i<=n;i++)
cin>>vo[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
for(j=v;j>=vo[i];j--)
{
dp[j]=Max(dp[j],dp[j-vo[i]]+va[i]);
}
}
cout<<dp[v]<<endl;
}
return 0;
}