c++的打怪兽问题!


题面描述
小轩由于见义勇为,他被赠予了光之巨人的变身器!于是小轩变身成为光之巨人,准备去打败入侵地球的怪兽。
这个怪兽血量非常多,总共有mm格血量。
小轩的光之巨人总共会用nn种攻击技能,第ii种攻击技能可以给怪兽造成A i格血的伤害,从而扣除怪兽A i格血量。

当小轩用技能把怪兽的血量扣除到0点以下,他就打败了了怪兽,获得胜利。

然而由于小轩第一次变身,所以任意的技能ii使用之后就会进入超长的冷却,也就是没一个技能只能使用一次。

那么小轩可以获胜吗,如果可以,输出 Yes ,否则输出 No 。

输入格式
第一行输入两个整数mm 、nn,表示怪兽血量为mm,小轩有nn种攻击技能。

接下来第二行输入mm个整数:A 1A 2...... A N,A i表示第ii种技能的伤害值。

输出格式
如果小轩可以获胜,输出 Yes ,否则输出 No 。

输入数据 1
10 3
4 5 6
输出数据 1
Yes
输入数据 2
20 3
4 5 6
输出数据 2
No

【以下回答由 GPT 生成】

解决方案

首先,我们可以使用动态规划来解决这个问题。

我们定义一个布尔型的二维数组dp[m+1][n+1],其中dp[i][j]表示小轩是否能使用前j个技能将怪兽的血量扣除到i以下。

初始化时,将dp[0][j]全设为true,表示小轩不需要使用任何技能就能将怪兽的血量扣除到0以下。

然后,我们可以用一个嵌套循环来遍历i从1到mj从1到n,并根据当前技能的伤害值判断小轩是否能够使用该技能:

  • 如果小轩可以使用当前技能,则有两种情况:
  • 使用当前技能,将怪兽的血量扣除到i-A[j-1]以下;
  • 不使用当前技能,保持怪兽的血量不变。 在这两种情况下,只要有一种情况小轩能够胜利,则将dp[i][j]设为true
  • 如果小轩不可以使用当前技能,则继续保持dp[i][j]的值为false

在循环结束后,如果dp[m][n]的值为true,则小轩能够获胜,输出"Yes";否则,输出"No"。

下面是具体的C++代码实现:

#include <iostream>
#include <vector>

using namespace std;

string canDefeatMonster(int m, int n, vector<int>& A) {
    vector<vector<bool>> dp(m+1, vector<bool>(n+1, false));

    // 初始化
    for (int j = 0; j <= n; j++) {
        dp[0][j] = true;
    }

    // 动态规划
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (i >= A[j-1]) {
                dp[i][j] = dp[i][j-1] || dp[i-A[j-1]][j-1];
            } else {
                dp[i][j] = dp[i][j-1];
            }
        }
    }

    if (dp[m][n]) {
        return "Yes";
    } else {
        return "No";
    }
}

int main() {
    int m, n;
    cin >> m >> n;

    vector<int> A(n);
    for (int i = 0; i < n; i++) {
        cin >> A[i];
    }

    string result = canDefeatMonster(m, n, A);
    cout << result << endl;

    return 0;
}

复杂度分析:

该算法使用了一个二维数组来存储中间结果,时间复杂度为O(mn),空间复杂度也为O(mn)。在整个算法过程中,只使用了一个二维数组来存储结果,没有使用额外的空间。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^