0 / 1 背包
HDU 2602 Bone Collector
thinking
0 / 1 背包裸体,直接找规律即可得出答案。
应该注意起始条件
code
#include <iostream>
#include <cstring>
using namespace std;
long long t,n,V;
long long p[1005],v[1005];
long long dp[1005][1005];
int main(){
cin >> t;
for (int ii = 0; ii < t; ++ii) {
cin >> n >> V;
memset(p,0, sizeof(p));
memset(v,0, sizeof(v));
memset(dp,0, sizeof(dp));
for (int j = 1; j <= n; ++j) {
cin >> p[j];
}
for (int j = 1; j <= n; ++j) {
cin >> v[j];
}
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= V; ++j) {
if (j<v[i]){
dp[i][j]=dp[i-1][j];
} else{
dp[i][j]=max(dp[i-1][j],p[i]+dp[i-1][j-v[i]]);
}
}
}
cout << dp[n][V]<<endl;
}
return 0;
}