Find a Number CodeForces - 1070A
阿新 • • 發佈:2018-12-02
題意:給定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; }