如何使用动态规划解决此题?
查看原帖
如何使用动态规划解决此题?
984289
Lin_last楼主2023/12/2 18:01

官方给的答案不是很能理解,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;
}

请问如何使用动态规划解决此题?官方的参考程序的逻辑又是什么?

2023/12/2 18:01
加载中...