01背包
题目描述
许多年前,在泰迪的故乡,有一个被称为“骨收集者”的人。这个人喜欢收集各种各样的骨头,比如狗的,牛的,还有他去坟墓的。
骨收集器有一个体积很大的V形包,在收集的过程中有很多骨头,显然,不同的骨头有不同的价值和不同的体积,现在根据每次旅行的骨头的价值,你能计算出骨收集器的总价值的最大值吗?
输入
第一行包含整数T,实例数。
其次是T型病例,每例三行,第一行包含两个整数n,v,(n<=1000,v<=1000),表示骨的数量和袋的体积。第二行包含表示每个骨的值的n个整数。第三行包含代表每个骨体积的n个整数。
产量
每行一个整数表示总值的最大值(这个数字小于2)三十一)
样本输入
1、5、10、1、2、3、4、5、5 4 4 3 2
样本输出
14
const int maxn = 1e3 + 5;
//int w[3]={150,200,350};
int t, n, W;
int c[maxn];//体积
int w[maxn];//价值
int dp[maxn][maxn];
int solve() {
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; i++)
for (int j = 0; j <= W; j++)
if (j >= c[i])
dp[i + 1][j] = max(dp[i][j], dp[i][j - c[i]] + w[i]);
else
dp[i + 1][j] = dp[i][j];
return dp[n][W];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
cin >> n >> W;
for (int i = 0; i < n; i++)
cin >> w[i];
for (int i = 0; i < n; i++)
cin >> c[i];
cout << solve() << endl;
}
return 0;
}