拜托了,牛老师(dfs)

题目描述 

时钟指向0点,又是新的一天。今天是七夕节,看着朋友圈牛云、牛郭、牛陈、牛余、牛lan等脱单牛准点发送的虐牛图,牛牛心理丝毫没有波动,因为他在协助科研人员制作新牛病毒的疫苗!
手机突然传来消息提醒:
七夕节有空出来一起吃饭吗?好久没见你了,想见你!——牛妹(清楚姐姐扮演)
疫苗的研发已经剩下最后一个难关:
定义一个函数 f(n) 为将 n 进行严格的因数分解(因数不重复,且分解的因数个数要大于1)后,使得所分解的因数之和最小的值,现在给出一个正整数 n,能否算出 f(n) ?
牛牛太想和牛妹一起过七夕节了,但他对这个问题毫无头绪,你能帮帮他解决这个问题吗?拜托了,牛老师!

输入描述:

输入一个整数n,2 <= n <= 106。

输出描述:

输出一个整数,表示 f(n) 的值。
示例1

输入

18

输出

9

说明

18可以分解成 1 * 18,2 * 9,3 * 6,显然 3 + 6 = 9是最优的(18 = 2 * 3 * 3 由于有重复值所以无法得到)。

示例2

输入

3

输出

4

说明

3可以分解成1 * 3(因数个数必须大于1),所以答案为4。

思路

直接暴搜,记录出现的因数。

#include<bits/stdc++.h>
using namespace std;
int n,minn;
int t[1000005];
void dfs(int x,int sum){
    if(!t[x]&&sum){
        minn=min(sum+x,minn);
    }
    for(int i=2;i<sqrt(x);i++){
        if(x%i==0&&!t[i]){
            t[i]++;
            dfs(x/i,sum+i);
            t[i]--;
        }
    }
}
int main(){
    cin>>n;
    minn=n+1;
    dfs(n,0);
    cout<<minn<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/mohari/p/13578483.html