[CF1070A] Find a Number - BFS,记忆化搜索
Posted mollnn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF1070A] Find a Number - BFS,记忆化搜索相关的知识,希望对你有一定的参考价值。
CF1070A Find a Number
Description
给定两个数 (d le 500) 和 (s le 5000),求最小的 (n) 使得 (d|n) 并且 (n) 的各位数字之和为 (s)。
Solution
设 (f[i][j]) 表示生成一个和为 (i) 且 (mod d=j) 的数字的最小 (n) 的末位数字
用 BFS 实现即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 505;
const int S = 5005;
int d,s,vis[N][S];
queue<pair<int,int>> q;
tuple<int,int,int> f[N][S];
void bfs()
{
vis[0][0]=1;
q.push({0,0});
while(q.size())
{
int x=q.front().first,y=q.front().second;
q.pop();
for(int i=0;i<10;i++)
{
int nx=(10*x+i)%d, ny=y+i;
if(ny<=s && vis[nx][ny]==0)
{
vis[nx][ny]=1;
f[nx][ny]=make_tuple(x,y,i);
q.push({nx,ny});
}
}
}
}
void print(int x,int y)
{
if(x||y)
{
print(get<0>(f[x][y]),get<1>(f[x][y]));
cout<<(char)(‘0‘+get<2>(f[x][y]));
}
}
signed main()
{
ios::sync_with_stdio(false);
cin>>d>>s;
bfs();
if(vis[0][s])
{
print(0,s);
}
else cout<<-1;
}
以上是关于[CF1070A] Find a Number - BFS,记忆化搜索的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces1070A Find a Number 图论