C++ 母亲节礼物:云朵搭配购买问题
这是一个经典的背包问题,可以使用动态规划来解决。
首先,我们可以定义一个二维数组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)。
原文地址: https://www.cveoy.top/t/topic/pav8 著作权归作者所有。请勿转载和采集!