int next_combination(int* pArray, int nLen, int nSel)
{
if (pArray[nLen - 1] + 1 < nSel)
{
++pArray[nLen - 1];
return 1;
}
else
{
int it = 2;
while (it <= nLen && pArray[nLen - it] + it == nSel)
++it;
if (it <= nLen)
{
int i;
pArray[nLen - it]++;
for (i = nLen - it + 1; i < nLen; ++i )
{
pArray[i] = pArray[i - 1] + 1;
}
return 1;
}
else
{
return 0;
}
}
}
#include <stdio.h>
int main()
{
int arrmap[] = {1, 2, 3, 4, 5};
int arr[] = {0, 1, 2};
do
{
int i;
for (i = 0; i < 3; ++i)
{
printf("%d ", arrmap[arr[i]]);
}
puts("");
} while (next_combination(arr, 3, 5));
return 0;
}
无重复组合计算
next_combination的参数是:
第一个是长度至少为n的数组,
第二个写n
第三个写m
计算m个里面选n个的组合,那个数组事先需要初始化为0,1,2,3...的形式
然后,next_combination函数每调用一次,就得到下一个组合
arrmap是用来把0 - n-1 映射到你需要的数值用的
{
if (pArray[nLen - 1] + 1 < nSel)
{
++pArray[nLen - 1];
return 1;
}
else
{
int it = 2;
while (it <= nLen && pArray[nLen - it] + it == nSel)
++it;
if (it <= nLen)
{
int i;
pArray[nLen - it]++;
for (i = nLen - it + 1; i < nLen; ++i )
{
pArray[i] = pArray[i - 1] + 1;
}
return 1;
}
else
{
return 0;
}
}
}
#include <stdio.h>
int main()
{
int arrmap[] = {1, 2, 3, 4, 5};
int arr[] = {0, 1, 2};
do
{
int i;
for (i = 0; i < 3; ++i)
{
printf("%d ", arrmap[arr[i]]);
}
puts("");
} while (next_combination(arr, 3, 5));
return 0;
}
无重复组合计算
next_combination的参数是:
第一个是长度至少为n的数组,
第二个写n
第三个写m
计算m个里面选n个的组合,那个数组事先需要初始化为0,1,2,3...的形式
然后,next_combination函数每调用一次,就得到下一个组合
arrmap是用来把0 - n-1 映射到你需要的数值用的
永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997