这个题虽然是个模板题,但是用dp的话更快
解题思路:首先作为一个dp题我们必须要求出他的状态转移方程
在我们读懂题意后不难得出他的方程是dp[i]=min(dp[i],dp[i-j]+最小公倍数(i,i-j))
方程出来后我们就应该在数组上铺一层数让他可以滚动起来;
首先我们可以保证1-22的最短路径就是他本身。其次我们可以先假设每个数字的最短路径是他本身-21。然后在从一到二十一依次试;
代码如下:
在这里插入代码片
#include<stdio.h>
int A[10000];
int min(int i, int n) {
return i < n ? i : n;
}
int qwe(int i, int n)//最小公倍数的函数
{
int t, k, l;
t = i > n ? i : n;
k = i < n ? i : n;
while (k)
{
l = t % k;
t = k;
k = l;
}
return (i * n) / t;
}
int main() {
int i, j;
for (i = 1;i <= 22;i++) A[i] = i;
for (i = 23;i <= 2021;i++){
A[i] = qwe(i, i - 21)+A[i-21];//先铺一层最长的路径
}
for (i =23;i<=2021;i++) {
for (j = 1;j <= 21;j++) {//从一到21开始试,得出最短路径,只有保证前面是对的,才能得出后面的解
A[i] = min(A[i], A[i-j] + qwe(i,i-j));
}
}
printf("%d\n", A[2021]);
return 0;
}