思路:
此题是简单的01背包问题只需要判断装一种物品时新的价值和旧的价值哪个更优
DP状态转移方程:
dp[ j ]=max[ dp[ i-w[ i ] ] + v[ i ],dp[ j ]. (dp[ j ]>=w[ i ])
#include<iostream>
#include<string>
using namespace std;
int solve();
int max(int i, int j);
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cout << solve()<<endl;
}
return 0;
}
int solve() {
int num, vbag; /*数量和容量*/
cin >> num >> vbag;
int* w, * v, * dp;
w = new int[num + 1];
v = new int[num + 1];
dp = new int[vbag + 1];
for (int i = 1; i <= num; i++) { /*初始化重量和价值*/
cin >> v[i];
}
for (int i = 1; i <= num; i++) {
cin >> w[i];
}
memset(dp, 0, sizeof(int)*(vbag+1));
for (int i = 1; i <= num; i++) {
for (int j = vbag; j >=w[i]; j--) { /*小于w[i]无需改动*/
dp[j] = max(dp[j - w[i]] + v[i], dp[j]); /*状态转移方程*/
}
}
return dp[vbag];
}
int max(int i, int j) {
return (i > j) ? i : j;
}