北京信息科技大學第十一屆程序設計競賽E-- kotori和素因子(深搜)

連接:https://ac.nowcoder.com/acm/contest/940/E

c++

 

題目描述

kotori拿到了一些正整數。她決定從每一個正整數取出一個素因子。可是,kotori有強迫症,她不容許兩個不一樣的正整數取出相同的素因子。spa

她想知道,最終全部取出的數的和的最小值是多少?code

注:若a%k==0,則稱k是a的因子。若一個數有且僅有兩個因子,則稱其是素數。顯然1只有一個因子,不是素數。blog

輸入描述:

第一行一個正整數n,表明kotori拿到正整數的個數。

第二行共有n個數ai,表示每一個正整數的值。

保證不存在兩個相等的正整數。

1<=n<=10

2<=ai<=1000

輸出描述:

一個正整數,表明取出的素因子之和的最小值。若不存在合法的取法,則輸出-1。
示例1

輸入

複製
4
12 15 28 22

輸出

複製
17

說明

分別取3,5,7,2,可保證取出的數之和最小
示例2

輸入

複製
5
4 5 6 7 8

輸出

複製
-1

備註:

1<=n<=10

2<=ai<=1000


思路:對每一個數先進行拆分素數,而後暴力搜就行。
代碼:
#include<bits/stdc++.h> 
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi  3.141592653589793
const LL mod = 1e9+7;
int k,prime[200],x[11],n; 
int mp[1001],ans = 100000000;
vector<int>v[11];
void init(){
    k = 0;
    prime[k] = 2;k++;
    prime[k] = 3;k++;
    for(int i = 5 ; i <= 1100 ; i++){
        int end = sqrt(i);
        int flag = 1;
        for(int j = 2 ; j <= end ; j++){
            if(i%j == 0){
                flag = 0;break;
            }
        } 
        if(flag == 1) {
            prime[k]=i;
            k++;
        }
    }
}
void dfs(int dep,int sum){
    if(dep == n){
        ans = min(ans,sum);return;
    }
    for(int i = 0 ; i < v[dep].size() ; i ++){
        if(!mp[v[dep][i]]){
            mp[v[dep][i]] = 1;
            dfs(dep+1,sum+v[dep][i]);
            mp[v[dep][i]] = 0;
        }
    }
}
int main()
{
    init();
    scanf("%d",&n);
    int flag = 1; 
    memset(mp,0,sizeof(mp));
    for(int i = 0 ; i < n ; i ++){
        scanf("%d",&x[i]);
        for(int j = 0 ; j < k ; j++){
            int number = x[i];
            if(number%prime[j] == 0){
                v[i].push_back(prime[j]);

                while(number%prime[j] == 0){
                    number/=prime[j];
                }
            }
            if(number == 1)break;
        }
    }
    dfs(0,0);
    printf("%d\n",ans == 100000000?-1:ans);
}
/*
5
4 5 66 29 124
*/
相關文章
相關標籤/搜索