有两个数字A和B,在每一步中我们可以将A与一个除数期望1和A相加。我们想要从A到B,我们可以得到B的最小步骤是什么?有时我们无法从A打印-1获得B.我想要一种能够解决这个问题的算法。
编辑:在每个步骤中考虑Z = A和Z中的一个除数Z期望1和Z得到B
4℃; = A< = B< = 100000
示例:A = 4,B = 24
4-> 6-> 8-> 12-> 18-> 24
正如你所看到的,这个例子的答案是5。
答案 0 :(得分:1)
您可以使用动态编程解决此问题
#include <iostream>
using namespace std;
#define INF 1000000007
int main() {
// your code goes here
int dp[101] = {0};
int a,b,i,j;
scanf("%d%d",&a, &b);
for(i=a;i<=b;i++)
dp[i] = INF;
dp[a] = 0;
for(i=a; i<=b; i++){
for(j=2; j*j<=i; j++){
if(i%j == 0){
dp[i+j] = min(dp[i+j], dp[i]+1);
dp[i+i/j] = min(dp[i+i/j], dp[i]+1);
}
}
}
printf("%d\n", dp[b]);
return 0;
}
dp [i]会更新所有i + j,其中j是i的因子
中查看复杂度O(n * sqrt(n))