前提・実現したいこと
AOJのALDS1_5_Aの問題をdpで解こうと思い実装したのですが、vectorのサイズオーバフローのエラーが出ました。なぜ出るのか全く分からないので、教えていただきたいです。問題の内容は、入力4行目の各数について、入力2行目の数をいくつか足し合わせて作ることができるか判定せよ、というものです。
発生している問題・エラーメッセージ
terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 18446744073709551597) >= this->size() (which is 2005) Aborted (core dumped)
入力例
5 1 5 7 10 21 4 2 4 17 8
期待される出力例
no no yes yes
該当のソースコード
C++
1#include <bits/stdc++.h> 2using namespace std; 3 4#define MAX 2005 5vector<vector<int>> dp(25, vector<int> (MAX, -1)); // dp配列 6 7int n, q; 8vector<int> a(MAX); 9 10int solve(int i, int m) { 11 if(dp.at(i).at(m) != -1) return dp.at(i).at(m); // 該当の部分が計算済みならそれを返す 12 13 if(m == 0) { // m == 0なら可能 14 dp.at(i).at(m) = 1; 15 }else if(i >= n) { // i >= nなら不可 16 dp.at(i).at(m) = 0; 17 }else if(solve(i + 1, m) == 1) { 18 dp.at(i).at(m) = 1; 19 }else if(solve(i + 1, m - a.at(i)) == 1) { 20 dp.at(i).at(m) = 1; 21 }else{ 22 dp.at(i).at(m) = 0; 23 } 24 return dp.at(i).at(m); 25} 26 27int main() { 28 cin >> n; 29 for(int i = 0; i < n; i++) cin >> a.at(i); 30 cin >> q; 31 for(int i = 0; i < q; i++) { 32 int m; 33 cin >> m; 34 if(solve(0, m)) cout << "yes" << endl; 35 else cout << "no" << endl; 36 } 37 return 0; 38}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/16 14:35
2021/02/18 01:46
2021/02/18 12:42