题目
思路
本题可以使用深搜+最优性剪枝的方法分别搜索最大值和最小值,搜索过程中,利用贪心的思想,搜索最大值时,高位从最大的数字9开始,按顺序向下搜索,只要保证每一位高位尽可能大,最终的结果就是最大的。同理,搜索最小值时,最高位从最小的1开始,其他位从最小的0开始,只要保证每一位高位尽可能的小,最终的结果一定是最小的
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int m , s;
vector<int> vt , st;
int flag0 = 1;
int flag = 1;
void dfs0 (int sum , int ans)
{
if(flag0 == 0) return;
// 结果剪枝
if(ans == m)
{
if (sum == s) flag0 = 0;
return;
}
// 最优性剪枝
if((m - ans)*9 + sum < s) return;
int begin = ans == 0 ? 1 : 0;
for(int i = begin ;i <= 9 ;i++)
{
st.push_back(i);
dfs0(sum + i, ans + 1);
if(flag0 == 0) return;
st.pop_back(); // 回溯
}
}
void dfs1(int sum ,int ans)
{
// cout << sum <<" " << ans << endl; //debug
// 结果剪枝
if(flag == 0) return;
if(sum == s && ans)
{
flag = 0;
return;
}
else if(sum > s) return;
if(ans == m) return;
// 最优性剪枝
if((m - ans)*9 + sum < s) return;
// 深搜
for(int i = 9 ;i >= 1 ;i--)
{
vt.push_back(i);
dfs1(sum + i, ans + 1);
if(flag == 0) return;
vt.pop_back(); // 回溯
}
}
int main()
{
cin >> m >> s;
// 特判
if(m == 1 && s == 0)
{
cout << 0 << " " << 0;
return 0;
}
// 贪心寻找最小值,从高位开始深搜,每位从 0 开始
dfs0(0 , 0);
if(!flag0)
{
for(auto i : st) cout << i;
}
else cout << -1;
cout << " ";
// 查找最大值
dfs1(0 , 0);
if(!flag)
{
// cout << vt.size() << endl; //debug
for(auto v : vt) cout << v;
int res = m - vt.size();
while(res--)
{
cout << 0;
}
}
else cout << -1;
return 0;
}