• 拜托了,牛老师(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;
    }
  • 相关阅读:
    第四章 利用函数实现指定的功能
    5-7 点到原点的距离(多态)
    5-2 宠物的生长(多态)
    5-7 学生cpp成绩统计
    5-6 学生CPP成绩计算
    php将远程图片下载保存到本地
    vs2010 调试快捷键
    vs2010 快捷键大全
    [C#] 使用Application.AddMessageFilter当做Form的热键
    C# 收发和处理自定义的WINDOWS消息
  • 原文地址:https://www.cnblogs.com/mohari/p/13578483.html
Copyright © 2020-2023  润新知