l****8 发帖数: 77 | 1 想实现如下任务:
有20个对象,可重复的取19个,列出并保存所有的组合。
网上搜了一下matlab的code,大概算到20个里取10个就out of memory了。
有没有什么算法能实现?不限matlab。 | l****8 发帖数: 77 | 2 补充一下,应该有 35,345,263,800 个解 | c*******h 发帖数: 1096 | 3 我怎么算出来有 577733918048911361 个解。。。
不过这个数有点接近long long int的极限了,不保证是对的。。。
【在 l****8 的大作中提到】 : 补充一下,应该有 35,345,263,800 个解
| l****8 发帖数: 77 | 4
网上有计算器:
http://keisan.casio.com/has10/SpecExec.cgi
你算的是排列?
【在 c*******h 的大作中提到】 : 我怎么算出来有 577733918048911361 个解。。。 : 不过这个数有点接近long long int的极限了,不保证是对的。。。
| c*******h 发帖数: 1096 | 5 // The following program prints all possible combinations of choosing
// r out of n objects with repetitions. Each line represents one
// combination; it contains n numbers, with the i-th number indicating
// the number of times the i-th object is chosen.
#include
using namespace std;
void recur(int idx, int rem, int *A, int len_A)
{
int i;
if (idx < len_A - 1) {
for (i = 0; i <= rem; i++) {
A[idx] = i;
recur(idx+1, rem-i, A, len_A);
}
}
else {
A[idx] = rem;
for (i = 0; i < len_A; i++) {
cout << A[i] << ' ';
}
cout << endl;
}
}
int main(void)
{
int n = 20;
int r = 19;
int *A = new int [n];
recur(0, r, A, n);
delete [] A;
return 0;
}
【在 l****8 的大作中提到】 : : 网上有计算器: : http://keisan.casio.com/has10/SpecExec.cgi : 你算的是排列?
| R*******n 发帖数: 428 | 6 要保存所有的组合是不可能的,你没有那么大的储存空间。把Google的
全部储存给你都不够用。
如果只是要随机地取一些组合,比如N个,那么MATLAB 就一句话,
c = ceil(20*rand(n,19));
另外,MATLAB 的 NCHOOSEK 没有重复取样。
【在 l****8 的大作中提到】 : 想实现如下任务: : 有20个对象,可重复的取19个,列出并保存所有的组合。 : 网上搜了一下matlab的code,大概算到20个里取10个就out of memory了。 : 有没有什么算法能实现?不限matlab。
|
|