1. 程式人生 > >Find a Number CodeForces - 1070A

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;
}