【发布时间】:2014-02-07 16:26:45
【问题描述】:
你将如何计算一个组合,例如(100,000 选择 50,000)?
到目前为止,我已经尝试了三种不同的方法,但由于显而易见的原因,每种方法都失败了:
1) 动态编程 - 数组的大小变得如此荒谬,以至于出现段错误
unsigned long long int grid[p+1][q+1];
//Initialise x boundary conditions
for (long int i = 0; i < q; ++i) {
grid[p][i] = 1;
}
//Initialise y boundary conditions
for (long int i = 0; i < p; ++i) {
grid[i][q] = 1;
}
for (long int i = p - 1; i >= 0; --i) {
for (long int j = q - 1; j >= 0; --j) {
grid[i][j] = grid[i+1][j] + grid[i][j+1];
}
}
2) 蛮力 - 显然计算甚至 100!不现实
unsigned long long int factorial(long int n)
{
return (n == 1 || n == 0) ? 1 : factorial(n - 1) * n;
}
3) 乘法公式 - 我无法存储它们太大的值
const int gridSize = 100000; //say 100,000
unsigned long long int paths = 1;
for (int i = 0; i < gridSize; i++) {
paths *= (2 * gridSize) - i;
paths /= i + 1;
}
// code from (http://www.mathblog.dk/project-euler-15/)
如果它有助于上下文,其目的是解决大型输入的“通过 m×n 网格有多少条路线”问题。也许我错过了解决问题?
【问题讨论】:
标签: c++ algorithm permutation dynamic-programming combinatorics