Find a Number CodeForces - 1070A

题意:给定d和s,求一个最小整数能被d整除,且各位数字之和等于s。

一开时直接按位数去搜,因为之前做过个位数为0和1,的一个类似的题,打出来之后根本跑不出来,数据量太大。

然后参考了网上代码。记忆化搜索,以余数和各位数之和为状态去搜(我一直感觉记忆化搜索长得和dp是的)然后递归输出。

#include <iostream>
#include<queue>
#include<stdio.h>
using namespace std;
struct code
{
    int x,y;
} tt,tep;
int visit[505][5005],mod,s;
int pre[505][5005][3];
void dfs()
{
    visit[0][0]=1;
    queue<code>p;
    tt.x=0;
    tt.y=0;
    p.push(tt);
    while(!p.empty())
    {
        tep=p.front();
        p.pop();
        for(int i=0; i<=9; i++)
        {
            int tx=(tep.x*10+i)%mod,ty=tep.y+i;
            if(ty>s||visit[tx][ty])
                continue;
            visit[tx][ty]=1;
            pre[tx][ty][0]=tep.x;
            pre[tx][ty][1]=tep.y;
            pre[tx][ty][2]=i;
            tt.x=tx,tt.y=ty;
            p.push(tt);
        }
    }
}
void out(int x,int y)
{
    if(x==0&&y==0)
        return;
    out(pre[x][y][0],pre[x][y][1]);
    printf("%d",pre[x][y][2]);
}
int main()
{
    cin>>mod>>s;
    dfs();
    if(visit[0][s])
        out(0,s);
    else
        printf("-1");
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41049928/article/details/84328898