码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1070A] Find a Number - BFS,记忆化搜索

时间:2020-07-16 21:11:17      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:math   lang   with   for   oid   sign   记忆化   inline   数字   

CF1070A Find a Number

Description

给定两个数 \(d \le 500\)\(s \le 5000\),求最小的 \(n\) 使得 \(d|n\) 并且 \(n\) 的各位数字之和为 \(s\)

Solution

\(f[i][j]\) 表示生成一个和为 \(i\)\(\bmod 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,记忆化搜索

标签:math   lang   with   for   oid   sign   记忆化   inline   数字   

原文地址:https://www.cnblogs.com/mollnn/p/13323950.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!