代码块注释的那两行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都不会超出这个范围,程序也能够正常运行。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
不知道你这个问题是否已经解决, 如果还没有解决的话:第一行的写法错误是因为在定义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。因此,没有出现第一行写法中的错误。