求解一道数学题的算法。大家帮忙,一定要比较优化的。 为什么要排序呢?用索引好像就可以了,当然这不是关键! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我只排一次序,并不影响速度啊。或者输入是有序的,不排。也一样的慢。我想最多我也就需要几千个数。我也不期望n会有上万个。这几千个数排序很快啊。排完序也就相当于加了索引。我排序是为了使我之后的元素添加和组合删除合理。(在递归时,只要有最大数,则去除掉该组合)兄弟再帮俺想想吧。谢谢。 与你的速度差不多。n=36,m=6时,总数有1947794组。输出在控制台也要不少时间!int main(int argc, char* argv[]){ printf("Hello World!\n"); static int nLen=36;//n static int nPickNum=6;//m int* pData=new int[nLen];//数据源。 int* pPickData=new int[nPickNum];//选出的数在数据源中的位置。 int nCount=1; for(int i=0;i<nLen;i++) pData[i]=i+1; printf("\n%d:",nCount++); for(int k=0;k<nPickNum;k++) { pPickData[k]=k; printf("%d,",pData[pPickData[k]]); } int nPickPos=nPickNum-1;//在pPickData中当前要替换的数的位置。 int nDataPos=nPickNum;//在pData中可成为替换数的位置。 while(nPickPos>=0) { //i是在pData中可成为替换数的位置。 for(i=nDataPos;i<nLen;i++) { pPickData[nPickPos]=i; printf("\n%d:",nCount++); for(k=0;k<nPickNum;k++) printf("%d,",pData[pPickData[k]]); } nPickPos--; while(nPickPos>=0) { if(pPickData[nPickPos]<(nLen-nPickNum+nPickPos)) { int nBegin=pPickData[nPickPos]; for(int j=nPickPos;j<nPickNum;j++) pPickData[j]=nBegin+(j-nPickPos)+1; printf("\n%d:",nCount++); for(int k=0;k<nPickNum;k++) printf("%d,",pData[pPickData[k]]); nPickPos=nPickNum-1; nDataPos=pPickData[nPickPos]+1; break; } else nPickPos--; } } delete pData; delete pPickData; return 0;} 怎样获得系统字体放大倍数 虚拟列表连接数据库的问题 如何屏蔽webbrowers 右键菜单? 请教:ADO+access怎样改变表的名字,表的内容不变? 在SDI应用中,怎样获得状态栏控件对象? 为什么我用CopyFile()复制文件夹的时候就出错,GetLastError()是5(拒绝访问) 简单问题,高分!!! 已经完成,谢谢winphoenix 找不到控件工具拦,为什么? 关于使用GDI+绘制png透明图片的问题 急!哪可以弄到网络设备的图标 VC++6.0中怎么样在对话框模式下能实现打印预览。
我想最多我也就需要几千个数。我也不期望n会有上万个。这几千个数排序很快啊。排完序也就相当于加了索引。我排序是为了使我之后的元素添加和组合删除合理。(在递归时,
只要有最大数,则去除掉该组合)兄弟再帮俺想想吧。谢谢。
int main(int argc, char* argv[])
{
printf("Hello World!\n"); static int nLen=36;//n
static int nPickNum=6;//m
int* pData=new int[nLen];//数据源。
int* pPickData=new int[nPickNum];//选出的数在数据源中的位置。
int nCount=1; for(int i=0;i<nLen;i++)
pData[i]=i+1;
printf("\n%d:",nCount++);
for(int k=0;k<nPickNum;k++)
{
pPickData[k]=k;
printf("%d,",pData[pPickData[k]]);
} int nPickPos=nPickNum-1;//在pPickData中当前要替换的数的位置。
int nDataPos=nPickNum;//在pData中可成为替换数的位置。
while(nPickPos>=0)
{
//i是在pData中可成为替换数的位置。
for(i=nDataPos;i<nLen;i++)
{
pPickData[nPickPos]=i;
printf("\n%d:",nCount++);
for(k=0;k<nPickNum;k++)
printf("%d,",pData[pPickData[k]]);
}
nPickPos--;
while(nPickPos>=0)
{
if(pPickData[nPickPos]<(nLen-nPickNum+nPickPos))
{
int nBegin=pPickData[nPickPos];
for(int j=nPickPos;j<nPickNum;j++)
pPickData[j]=nBegin+(j-nPickPos)+1;
printf("\n%d:",nCount++);
for(int k=0;k<nPickNum;k++)
printf("%d,",pData[pPickData[k]]);
nPickPos=nPickNum-1;
nDataPos=pPickData[nPickPos]+1;
break;
}
else
nPickPos--;
}
}
delete pData;
delete pPickData;
return 0;
}