话不多说,直接看题:

我们不妨把问题抽象一下:
首先,我们由裴蜀定理知道如果两个数互质,那么ax+by=c一定有整数解(只要c为1的倍数也就是整数),因此问题就转换为求选一些数使他们gcd==1(对1特判)
考虑到与背包问题的类似性,于是我们令f[i][j]为前i个数gcd==j的最小花费。
于是我们得到转移方程:f[i][j]=min(f[i-1][j],f[i-1][k]+c[i])(k与li的gcd==j)
但是我们注意一下范围k显然不能遍历到10^9,注意到我们遍历的为gcd,而这个远小于li,因此我们可以用map来优化空间(存可能的gcd),每一轮的gcd在循环时直接推出即可。
下面为AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ma 10000000
#define int long long
int n,l[310],c[310],cnt;
map<int,int> a[310];
int _gcd(int a,int b){
while(b){
int tmp=b;
b=a%b;
a=tmp;
}
return a;
}
struct node{
int dian,zhi;
};
queue<int> q;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) scanf("%lld",&l[i]);
for(int i=1;i<=n;i++) scanf("%d",&c[i]);
int ans=ma;
for(int i=1;i<=n;i++){
if(a[i].count(l[i])==0) a[

文章讲述了如何通过裴蜀定理将问题转化为背包问题形式,利用gcd和动态规划的方法求解,同时通过空间优化减少存储需求。给出了两个具体的编程代码示例,展示了如何处理范围限制和优化空间的问题。
最低0.47元/天 解锁文章
1312

被折叠的 条评论
为什么被折叠?



