官方给的答案不是很能理解,GESP 9月认证C++五级真题,想到了用动态规划,但是写出来的转移方程明显有问题
#include <bits/stdc++.h>
using namespace std;
const int N = 5e2 + 10;
int dp[N][N], wget[N], value[N];
int n;
int main() {
scanf("%d", &n);
for (int i = 0, x; i < n; ++i) {
scanf("%d", &x);
wget[i] = x;
}
for (int i = 0, x; i < n; ++i) {
scanf("%d", &x);
value[i] = x;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (i < wget[i - 1]) {
dp[i][j] = dp[i][j - 1];
} else {
dp[i][j] = max(dp[i - 1][j], dp[i-wget[i - 1]][j - 1] + value[i - 1]);
}
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
printf("%d ",dp[i][j]);
}
}
printf("%d", dp[n][n]);
return 0;
}
请问如何使用动态规划解决此题?官方的参考程序的逻辑又是什么?