一个关于vector的抽象问题

代码块注释的那两行vector的写法,第一行那样写就WA了,但是第二行那样写就能AC.(其他都没变);想知道是啥子原因?感觉有点抽象。


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
int n, m;
int a[110], b[1000];
void solve() {
    for (int i = 1;i <= n;i++) {
        cin >> a[i];
    }
    for (int i = 1;i <= n;i++) {
        cin >> b[i];
    }
    /*
    * m的范围<=1e5;
    vector<int>dp(m+10, -1);//wrong answer
    vector<int>dp(100005, -1);//accepted
    */
    dp[0] = 0;
    for (int i = 1;i <= n;i++) {
        for (int j = 0;j <= m;j++) {
            if (dp[j] >= 0)
                dp[j] = b[i];
            else
            {  
                if (j - a[i] >= 0 && dp[j - a[i]] > 0) 
                    dp[j] = dp[j - a[i]] - 1;
            }
        }
    }
    LL ans = 0;
    for (int i = 1;i <= m;i++) {
        ans += dp[i] >= 0;
    }
    cout << ans << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    while (cin >> n >> m) {
        if (n == 0 && m == 0)break;
        solve();
    }
    return 0;
}

你第一行代码中使用的是变量m的值来初始化vector的大小的,而m的值在运行的时候是不确定的。如果m的值过大就会超出vector的范围,导致运行出错。
但是你的第二行代码中使用的是一个固定的值100005来初始化vector的大小,保障了vector能够容纳所有可能的数据。所以不论m的值是多少,vector都不会超出这个范围,程序也能够正常运行。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    第一行的写法错误是因为在定义vector<int> dp(m+10, -1)时,使用了变量m的值去初始化dp的大小。在这段代码中,变量m是在main()函数中接收用户输入的,因此在执行vector<int> dp(m+10, -1)这一行时,m的值尚未被赋值。因此,dp的大小取决于未初始化的m的值,导致程序在运行时可能会出现未定义行为。

    第二行的写法正确是因为直接设置了vector<int> dp(100005, -1)的大小,不受变量m的值的影响。这样可以确保dp的大小为100005,并且所有元素的初值均为-1。因此,没有出现第一行写法中的错误。


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