dfs与数学的应用

链接: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的用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值