题目链接:https://vjudge.net/problem/UVA-11384
这道题要分析得透:
如果我们手模的话,会发现:如果先将大于$frac{n}{2}$的数都减去$frac{n}{2}$是最优的,
这时候从$frac{n}{2} +1$到$n$我们是不用考虑的,因为它们小于从$1$到$frac{n}{2}$。
因此转移方程便是:
$f[1]=1$
$f[i]=f[i/2]+1$
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 int n; 7 int f(int x){ 8 if(x==1) return 1; 9 return f(x/2)+1; 10 } 11 12 int main(){ 13 while(scanf("%d",&n)!=EOF){ 14 printf("%d ",f(n)); 15 } 16 }