解题思路: 根据题意,精卫需要把东海填平,即需要找到一些木石,使得它们的体积之和等于或超过东海未填平区域的体积。同时,精卫的体力不能超过剩余的体力。

我们可以使用动态规划来解决这个问题。定义一个二维数组dp,其中dp[i][j]表示使用前i块木石,体力不超过j的情况下,能够达到的最大体积。初始时,dp[0][j]都为0,表示使用0块木石时的最大体积都为0。

然后我们遍历每一块木石,对于第i块木石,我们有两种选择:衔上它或不衔上它。如果选择衔上它,那么dp[i][j]的值就等于dp[i-1][j-k] + v[i],其中k表示衔上第i块木石需要的体力。如果选择不衔上它,那么dp[i][j]的值就等于dp[i-1][j]。我们选择这两种情况中的最大值作为dp[i][j]的值。

最终,我们只需要判断dp[n][c]是否大于等于目标体积即可。如果是,说明精卫能够把东海填平,输出dp[n][c];否则,输出Impossible。

时间复杂度分析: 动态规划的时间复杂度为O(n*c),其中n为木石的数量,c为剩余的体力。由于n和c的范围较小,所以算法的时间复杂度是可接受的。

空间复杂度分析: 动态规划中使用了一个二维数组dp,所以空间复杂度为O(n*c)。同样地,由于n和c的范围较小,所以空间复杂度也是可接受的。

代码实现如下:

#include #include using namespace std;

int main() { int v, n, c; cin >> v >> n >> c;

vector<int> volume(n+1);
vector<int> energy(n+1);
for (int i = 1; i <= n; i++) {
    cin >> volume[i] >> energy[i];
}

vector<vector<int>> dp(n+1, vector<int>(c+1, 0));
for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= c; j++) {
        dp[i][j] = dp[i-1][j];
        if (j >= energy[i]) {
            dp[i][j] = max(dp[i][j], dp[i-1][j-energy[i]] + volume[i]);
        }
    }
}

if (dp[n][c] >= v) {
    cout << dp[n][c] - v << endl;
} else {
    cout << "Impossible" << endl;
}

return 0;
本题为改编题。发鸠之山其上多柘木。有鸟焉其状如乌文首白喙赤足名曰精卫其名自詨。是炎帝之少女名曰女娃。女娃游于东海溺而不返故为精卫。常衔西山之木石以堙于东海。——《山海经》精卫终于快把东海填平了!只剩下了最后的一小片区域了。同时西山上的木石也已经不多了。精卫能把东海填平吗?事实上东海未填平的区域还需要至少体积为 �v 的木石才可以填平而西山上的木石还剩下 �n 块每块的体积和把它衔到东海需要的体力分

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

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