题意:给定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;
}