动态规划跳跃问题c++

(用动态规划,c++实现)
小明在数轴上的坐标 0 处。现在小明将进行N次跳跃。第i次朝数轴正方向跳ai或bi个单位。请你判断跳N次以后他能否停留在坐标X

输入描述

第一行输入N和X,接下来N行输入ai和bi,其中
1≤i≤N
1≤ai,bi≤100
1≤X≤10000

输出描述

如果能在 N 次跳跃后到达位置 X,则输出 Yes,否则输出 No。

用例输入

2 10
3 6
4 5

用例输出

Yes

#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 10010;
int Num[MAX_N][2];

int Sum[MAX_N][MAX_N];
int N, X;
int main()
{
cin >> N >> X;
for (int i = 1; i <= N; i++)
{
cin >> Num[i][0] >> Num[i][1];
}
Sum[0][0] = 1;
for (int i = 1; i <= N; i++)
{
for (int j = 0; j <= X; j++)
{
if (Sum[i - 1][j])
{
Sum[i][j + Num[i][0]] = Sum[i][j + Num[i][1]] = 1;
}
}
}
if (Sum[N][X]==1)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}

int bfs(int n, int x, int ai[], int bi[])
{
    queue<int> q;
    q.push(ai[0]);
    q.push(bi[0]);
    for(int i = 1; i < n; i++)
    {
        int size = q.size();
        while(size > 0){
            int pop = q.front();
            if (pop+ai[i] <= x)
            {
                q.push(pop + ai[i]);
            }
            if (pop+bi[i] <= x)
            {
                q.push(pop + bi[i]);
            }
            q.pop();
            size--;
        }
    }
    while(!q.empty())
    {
        if(q.front() == x)
            return 1;
        q.pop();
    }
    return 0;
}