链接:https://ac.nowcoder.com/acm/problem/50042
来源:牛客网
**kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。但是,kotori有强迫症,她不允许两个不同的正整数取出相同的素因子。
她想知道,最终所有取出的数的和的最小值是多少?
注:若a%k==0,则称k是a的因子。若一个数有且仅有两个因子,则称其是素数。显然1只有一个因子,不是素数。
输入描述:
第一行一个正整数n,代表kotori拿到正整数的个数。
第二行共有n个数ai,表示每个正整数的值。
保证不存在两个相等的正整数。
1<=n<=10
2<=ai<=1000**
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<string.h>
#include<vector>
#include<deque>
#include<queue>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn=1005;
bool vis[maxn];
int ans=1e9;
vector<int>p[12];
void dfs(int n,int res)
{
if(ans<=res)return;
if(!n)ans=res;
else{
for(int i=0;i<p[n].size();i++)
{
if(!vis[p[n][i]])
{
vis[p[n][i]]=1;
dfs(n-1,res+p[n][i]);
vis[p[n][i]]=0;
}
}
}
}
int main()
{
IOS;
int n,a;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
for(int j=2;j<=a/j;j++)
{
if(a%j==0)p[i].push_back(j);
while(a%j==0)a/=j;
}if(a>1)p[i].push_back(a);
} dfs(n,0);
printf("%d",ans==1e9 ? -1:ans);
return 0;
}
这个dfs我想了一会发现一个基本的全排列问题和这个很像,把ng字符放入m个箱子一个有多少个排法,这不就是我们要把n个数字放到m个箱子里,每个箱子不能有重复,且每个数字对应可选择的有m1个箱子,如果搜到结尾ans=res;如果ans<=res就返回不在往下找,min的用法。