题目链接: [Bone Collector]
大致题意:
骨头收集者带着体积V的背包捡骨头,已经每个骨头的重量和价值,求能装进背包的最大价值
解题思路:
01背包,每个骨头有两种选择,装和不装,具体看代码
AC代码:
//dp
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
typedef long long ll;
using namespace std;
struct node {
int w, v;
}bone[1010];
int N, V;
int dp[1010][1010];
int ans() {
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= N; ++i) {
for (int j = 0; j <= V; ++j) {
if (bone[i].v > j)dp[i][j] = dp[i - 1][j];//装不下
else {//装得下,找最大价值
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - bone[i].v] + bone[i].w);
}
}
}
return dp[N][V];
}
int main(void)
{
int t; scanf("%d", &t);
while (t--) {
scanf("%d%d", &N, &V);
for (int i = 0; i < N; ++i) cin >> bone[i].v;
for (int i = 0; i < N; ++i) cin >> bone[i].w;
cout << ans() << endl;
}
return 0;
}
``
```cpp
//滚动数组
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
typedef long long ll;
using namespace std;
struct node {
int w, v;
}bone[1010];
int N, V;
int dp[1010];
int ans() {
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= N; ++i) {
for (int j = V; j >= bone[i].v; --j) {
dp[j] = max(dp[j], dp[j - bone[i].v] + bone[i].w);
}
}
return dp[V];
}
int main(void)
{
int t; scanf("%d", &t);
while (t--) {
scanf("%d%d", &N, &V);
for (int i = 0; i < N; ++i) cin >> bone[i].v;
for (int i = 0; i < N; ++i) cin >> bone[i].w;
cout << ans() << endl;
}
return 0;
}