已知N个糖果的重量和价值. 我们有一个口袋, 最多可以装V重量的糖果. 问口袋最多能放多少价值的糖果进去?
Input
输入的第一行是T, 表示有T组数据.
每组数据由三行组成.
第一行包含两个整数N和V(N <= 1000, V <= 1000). N表示糖果的个数, V表示口袋的载重.
第二行包含N个整数, 表示每一颗糖果的价值.
第三行包含N个整数, 表示每一颗糖果的重量.
Output
对每一组数据, 输出口袋最终可以放进去糖果的价值.
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
思路:01背包一般用一维数组优化空间。
#include <iostream>
#include <cstring>
using namespace std;
const int MAX=1005;
int v[MAX],w[MAX],dp[MAX];
int main()
{
int T;
cin>>T;
while(T--)
{
memset(dp,0,sizeof(dp));
int total,weight;
cin>>total>>weight;
for(int i=1;i<=total;i++)
{
cin>>v[i];
}
for(int i=1;i<=total;i++)
{
cin>>w[i];
}
for(int i=1;i<=total;i++)
{
for(int j=weight;j>=w[i];j--)
{
// if(j>=w[i])
// {
dp[j]=max(dp[j],dp[j-w[i]]+v[i]); // 在j的容量下最大价值
// dp[j]>dp[j-w[i]]+v[i]?dp[j]=dp[j]:dp[j]=dp[j-w[i]]+v[i];
// }
}
}
cout<<dp[weight]<<endl;
}
return 0;
}