#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
//f[i]=f[i]
int red(){
int f=1,x=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return f*x;
}
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
int n;
const int maxn=310,maxc=1e5+10;
struct node{
int l,c;
};
node a[maxn];
int f[maxn*maxc];
map<int ,int >mp;
int ans=0;
int main(){
n=red();
for(int i=1;i<=n;i++){
a[i].l=red();
}
for(int i=1;i<=n;i++){
a[i].c=red();
}
// for(int i=1;i<=n;i++)mp[a[i].l]=a[i].c;
for(int i=1;i<=n;i++){
for(auto it=mp.begin(); it != mp.end(); ++it) {
if(mp[gcd(it->first,a[i].l)]==0)
mp[gcd(it->first,a[i].l)]=1e9+10;
//cout<<it->first<<endl;
mp[gcd(it->first,a[i].l)]=min(mp[gcd(it->first,a[i].l)],it->second+a[i].c);
}
if(mp[a[i].l]==0)mp[a[i].l]=a[i].c;
else mp[a[i].l]=min(mp[a[i].l],a[i].c);
}
if(mp.find(1) == mp.end()){
puts("-1");
return 0;
}
printf("%d",mp[1]);
return 0;
}
为什么边加入边进行dp对,先把所有卡片加入不对(注释部分)求解析