基础算法-DFS
关于我转生变成史莱姆这档事(DFS暴搜)
题目:
史莱姆要吃掉总量为
S
的魔素,并且每一天吃掉的魔素都要为前一天的2~9倍(整数倍)
求最短的天数并且要恰好吃完所有的魔素输入:
571
输出:
5
将题目进行用表达式表达:
因此可以进行暴搜,将括号一层一层拆开,只要每一层都能满足整除关系即可。
如:先对
s
s
s进行因数分解,得到
a
1
a_1
a1的值,然后将括号打开,令
s
′
=
s
a
1
−
1
s'=\frac{s}{a_1}-1
s′=a1s−1。
之后的递归只需要考虑2~9是否是
s
′
s'
s′的因子,如果是的话就可以再次拆开括号,继续递归
s
′
′
s''
s′′
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define endl '\n'
typedef long long ll;
const int INF = 1 << 30;
int s, ans;
int dfs(int s)
{
if (s >= 2 && s <= 9) return 1;
int ans = INF;
for (int i = 2; i <= 9; i++) {
if (s % i == 0) {
ans = min(ans, dfs(s / i - 1) + 1);
}
}
return ans;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
cin >> s;
ans = INF;
for (int i = 1; i * i <= s; i++) {
if (s % i == 0) {
ans = min(ans, dfs(s / i - 1) + 1);
if (i != s / i) {
ans = min(ans, dfs(i - 1) + 1);
}
}
}
cout << (ans == INF ? -1 : ans) << endl;
}