这是一个经典的背包问题,可以使用动态规划来解决。

首先,我们可以定义一个二维数组dp,其中dp[i][j]表示在前i朵云中,花费不超过j的情况下可以获得的最大价值。

接下来,我们可以使用一个循环来遍历每一朵云,然后再使用一个内部循环来遍历每一种花费情况。对于每一朵云,如果它的价钱小于等于当前花费情况,我们可以选择购买它,此时可以获得的最大价值为它的价值加上前i-1朵云中花费不超过j-当前云价钱的最大价值,即dp[i][j] = dp[i-1][j-云价钱] + 云价值。同时,我们还需要考虑是否需要购买与当前云有搭配关系的其他云,如果需要,我们也需要加上这些云的价值。

最后,我们可以返回dp[n][w]作为结果,表示在前n朵云中花费不超过w的情况下可以获得的最大价值。

下面是具体的代码实现:

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

int main() {
    int n, m, w;
    cin >> n >> m >> w;
    
    vector<int> price(n+1);
    vector<int> value(n+1);
    for (int i = 1; i <= n; i++) {
        cin >> price[i] >> value[i];
    }
    
    vector<vector<int>> dp(n+1, vector<int>(w+1, 0));
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= w; j++) {
            if (price[i] <= j) {
                dp[i][j] = max(dp[i][j], dp[i-1][j-price[i]] + value[i]);
            }
        }
    }
    
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        dp[u][w] = max(dp[u][w], dp[v][w]);
        dp[v][w] = max(dp[v][w], dp[u][w]);
    }
    
    cout << dp[n][w] << endl;
    
    return 0;
}

时间复杂度分析:外层循环有n次迭代,内层循环有w次迭代,所以总时间复杂度为O(nw)。空间复杂度为O(nw)。

C++ 母亲节礼物:云朵搭配购买问题

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

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