这是一个背包问题,只是在选择物品时需要考虑搭配条件。

首先定义一个二维数组dp,其中dp[i][j] 表示前i朵云中选择搭配条件满足的云朵总价值不超过j时能够获得的最大价值。

然后对于每一朵云,判断其是否满足搭配条件,如果满足条件,则将其价值加入到dp数组中。

最后输出dp数组中最后一行的最大值即为所求的结果。

代码实现如下:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m, w;
    cin >> n >> m >> w;
    vector<int> price(n+1); // 云朵的价钱
    vector<int> value(n+1); // 云朵的价值
    vector<vector<int>> match(n+1, vector<int>(n+1)); // 云朵之间的搭配条件
    vector<vector<int>> dp(n+1, vector<int>(w+1, 0)); // 动态规划数组

    for (int i = 1; i <= n; i++) {
        cin >> price[i] >> value[i];
    }

    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        match[u][v] = 1;
        match[v][u] = 1;
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= w; j++) {
            if (j >= price[i]) {
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-price[i]] + value[i]);
            } else {
                dp[i][j] = dp[i-1][j];
            }
            // 判断搭配条件
            for (int k = 1; k < i; k++) {
                if (match[i][k] && dp[i][j] < dp[k][j]) {
                    dp[i][j] = dp[k][j];
                }
            }
        }
    }

    cout << dp[n][w] << endl;

    return 0;
}

原文地址: https://www.cveoy.top/t/topic/pawy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录