这是一个Oracle面试中的问题。例如,如果我的输入是6,那么
- 5+1=6 答案:2
- 4+2=6 答案:2
- 3+2+1=6 答案:3
因此,最终答案应为3。(即需要3、2、1来得到总和6)
注意:不允许重复使用数字(即1+1+1+1+1+1=6不行)
我用递归解决了这个问题,但面试官并不满意。动态规划是否可行?
这是一个Oracle面试中的问题。例如,如果我的输入是6,那么
因此,最终答案应为3。(即需要3、2、1来得到总和6)
注意:不允许重复使用数字(即1+1+1+1+1+1=6不行)
我用递归解决了这个问题,但面试官并不满意。动态规划是否可行?
求 x 个数的最小和为
只需找到满足不等式的 x:
以下是代码:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int x = 1;
while ((x+1)*x/2 <= n) x++;
x--; // now (x+1)*x/2 > n , so x is too large
printf("%d\n", x);
return 0;
}
如果n非常大,您可以使用二分搜索。
i.e. f(x) = x * (x + 1) / 2.
f(x) = x * (x + 1 ) / 2 = N
i.e. x**2 + x = 2*N
x**2 + x - 2*N = 0
解决这个二次方程,我们得到:
由于数字x不是负数,我们不能有:
因此,我们得到:
当N = 6时:
这是一个完美的整数。但是当N = 12时:
它等于8.845 / 2,是一个分数。向下取整值为4,这就是答案。
简而言之:实现一个函数f(N) = (int) ((-1.0 + sqrt(1 + 8*N))/2.0 )
即:
int max_partition_length(int n){
return (int)((-1.0 + sqrt(1 + n*8))/2);
}