19(魔法数字)小 H 的魔法数字是 4。给定n,他希望用若干个 4 进行若干次加法、减法和整除运算得到 n。但由于小 H 计算能力有限,计算过程中只能出现不超过M = 10000 的正整数。求至少可能用到多少个 4。
例如,当 n = 2 时,有 2 = (4 + 4)/4,用到了 3 个 4,是最优方案。
试补全程序。
- #include <iostream>
- #include <cstdlib>
- #include <climits>
- using namespace std;
- const int M = 10000;
- bool Vis[M + 1];
- int F[M + 1];
- void update(int &x, int y) {
- if (y < x)
- x = y;
- }
- int main() {
- int n;
- cin >> n;
- for (int i = 0; i <= M; i++)
- F[i] = INT_MAX;
- ①;
- int r = 0;
- while (②) {
- r++;
- int x = 0;
- for (int i = 1; i <= M; i++)
- if (③)
- x = i;
- Vis[x] = 1;
- for (int i = 1; i <= M; i++)
- if (④) {
- int t = F[i] + F[x];
- if (i + x <= M)
- update(F[i + x], t);
- if (i != x)
- update(F[abs(i - x)], t);
- if (i % x == 0)
- update(F[i / x], t);
- if (x % i == 0)
- update(F[x / i], t);
- }
- }
- cout << F[n] << endl;
- return 0;
- }
单选
①处应填( )
A.F[4] = 0
B.F[1] = 4
C.F[1] = 2
D.F[4] = 1
单选
②处应填( )
A.!Vis[n]
B.r < n
C.F[M] == INT_MAX
D.F[n] == INT_MAX
第3题 单选
③处应填( )
A.F[i] == r
B.!Vis[i] && F[i] == r
C.F[i] < F[x]
D.!Vis[i] && F[i] < F[x]
第4题 单选
④处应填( )
A.F[i] < F[x]
B.F[i] <= r
C.Vis[i]
D.i <= x