SP7579 YOKOF - Power Calculus

来一发简单做法

题目链接:SP7579 YOKOF - Power Calculus

题目大意:如何用最少的步数凑出一个次数。

思考一个问题:题干提到的相乘,实际上可以看做同底数幂相乘,底数不变,指数相加,我们只需要维护一个变量指数就可以了。

那么难点就来了,怎么有效的利用中间产物?开个数组 \(num\) 储存,下标就可以是当前用的步数。

我们可以使用迭代加深搜索,每次规定一个步数,能到达目标,就返回一,输出该步数。考虑剪枝,如果从当前局面开始,每次都用最大的两个数相乘,也就是最大的两个指数相加,都不能达到目标的话,就直接返回不可以。

记得处理边界,搜到最后一步,或者一波操作也没能返回可以,就只好返回不可以了!

见代码:

#include<iostream>
#include<cstdio>
using namespace std;
int num[100001], n, dep;

bool dfs(int step,int now){
    if(now <= 0 || step > dep || now << (dep - step) < n) return 0;
    if(now << (dep - now) == n) return 1;
    if(now == n) return 1;
    num[step] = now;//储存当前步骤的指数
    for(int i = 0;i <= step; i++){
        if(dfs(step + 1,now + num[i])) return 1;
        if(dfs(step + 1,now - num[i])) return 1;

    }
    return 0;
}

int main(){
    while(1){
        cin >> n;
        if(n == 0) break;
        for(dep = 0; ; dep++){
            if(dfs(0,1)) break;
        }
        cout << dep << endl;
    }
    return 0;
}
posted @ 2023-06-07 18:18  朝绾曦梦  阅读(25)  评论(0编辑  收藏  举报