Fox And Jumping
题目链接
题意是花最小的价值选几个数,使这几个数可以组成任意数
根据裴蜀定理即让这几个数最大gcd为1
状态表示:f[i]表示最大公约数为i得最小花费
然后暴力就行了
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
const int N = 310;
int n;
map<int,int>f;
int w[N],a[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<=n;i++)
{
if(f[a[i]]==0)f[a[i]]=w[i];
else f[a[i]]=min(f[a[i]],w[i]);
for(auto [x,c] : f)
{
int t=__gcd(x,a[i]);
if(f[t]==0)f[t]=f[x]+w[i];
else f[t]=min(f[t],f[x]+w[i]);
}
}
if(f[1]==0)f[1]=-1;
cout<<f[1]<<endl;
}