题意:
有n张卡片,第i张卡片上的数值为a(i)
数据范围:n<=300,a(i)<=1e9,c(i)<=1e5
解法:
题目可以转化为:
给定n个不相同的数,取第i个数的代价为c[i],
要求取出若干个数,满足这些数的gcd为1,输出最小代价
d[k]表示gcd为k的最小代价,转移方程:
d[gcd(k,a[i])]=min(d[gcd(k,a[i])],d[k]+c[i])
因为gcd非连续,所以用map离散化
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=305;
int a[maxm];
int c[maxm];
int n;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>c[i];
map<int,int>d;
for(int i=1;i<=n;i++){
for(auto it=d.begin();it!=d.end();it++){
int g=__gcd(it->first,a[i]);
if(!d.count(g))d[g]=it->second+c[i];
else d[g]=min(d[g],it->second+c[i]);
}
if(!d.count(a[i]))d[a[i]]=c[i];
else d[a[i]]=min(d[a[i]],c[i]);
}
if(!d.count(1))cout<<-1<<endl;
else cout<<d[1]<<endl;
return 0;
}