C++ SPOJ ONEZERO(一和零)

C++ SPOJ ONEZERO(一和零),c++,optimization,C++,Optimization,我试图通过使用BFS来解决这个问题,并存储剩余部分并更新它。然而,当我这样做时,我会得到TLE,我如何才能消除它 int t,n,i,j,z,y; string l,m; scanf("%d",&t); while(t--) { scanf("%d",&n); pair<string,int>b; queue<pair<string,int> >a; b=make_pair("1",1); a.push

我试图通过使用BFS来解决这个问题,并存储剩余部分并更新它。然而,当我这样做时,我会得到TLE,我如何才能消除它

int t,n,i,j,z,y;

string l,m;
scanf("%d",&t);
while(t--)
{
    scanf("%d",&n);
    pair<string,int>b;
    queue<pair<string,int> >a;
    b=make_pair("1",1);
    a.push(b);
    bool r[20001]={0};
    while(!a.empty())
    {
        b=a.front();
        a.pop();
       // cout<<b.first<<endl;
        if(b.second%n==0)
        {
            printf("%s\n",b.first.c_str());
            break;
        }
        m=b.first;
        y=b.second;
        z=(y*10)%n;
        if(r[z]==0)
        {    r[z]=1;
             l=m+'0';
        b=make_pair(l,z);
        a.push(b);
        }

        z=(y*10+1)%n;
        if(r[z]==0)
        {    r[z]=1;
             l=m+'1';
        b=make_pair(l,z);
        a.push(b);
        }
    }
}

换个角度想。你有一个a_i=10^i%n,你想找到这样的b_i=0..1,suma_i*b_i,i%n=0。看起来这是一个动态规划任务

有一个数组m,其中m[i][j]=true意味着我可以表示k个0和1,这样k%n==j,我们不需要超过i位

在DP公式中,当m[i][j]=true时,m[i+1][j]=m[i+1][j+10^i%n]=true

要显示该数字,您需要从m[somewhere][0]=true返回m


在发送前测试您的解决方案中所有可能的n,因为它们很少,只有20000个。我认为您甚至可以预先生成所有的解决方案,并编写一个数组查找解决方案。

您是否可以解释一下代码的工作原理?问题是找到最小的数字,它只包含0和1,可以被n整除。我正在使用bfs,有一个由该数字作为字符串和余数组成的队列。首先我插入1,然后将0和1添加到队列中,如果余数为0,那么我打印答案并打破循环。你需要发明比bfs更智能的东西。这就是重点。这些问题的设计使得BFS能够解决。@n.m.我不太确定。它可以是一个图形搜索优化的任务。