/*求(1...m)中,n個數的組合
本程式的思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標代表的數被選中,為0則沒選中。
首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。
然後從左到右掃瞄陣列元素值的「10」組合,找到第乙個「10」組合後將其變為「01」組合,
同時將其左邊的所有「1」全部移動到陣列的最左端。
當第乙個「1」移動到陣列的m-n的位置,即n個「1」全部移動到最右端時,就得到了最後乙個組合。
例如求5中選3的組合:
1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5
*/#include
#include
#include
#include
#include
using namespace std;
#include
#include
//#include
//float x[5] = ;
float x[20] = ;
vector*>* store_vect = new vector *> ;
//輸出
void output(int *num, int m)
else
}printf("\n");
store_vect->push_back(vect);
}//檢測n個「1」是否全部移動到最右端
//是則返回1
int check(int *num, int m, int n)
}return flag;
}void choosenum(int m, int n)
for(i = n; i < m; ++i)//後面m-n個元素置0
*(num+i) = 0;
output(num, m);
while(1)
if(*(num+i) == 1)
++count;
}//將其左邊的所有「1」全部移動到陣列的最左端
for(j = 0; j < i; ++j)
else}//
printf("輸出 \n");
output(num, m);
if(check(num, m, n) == 1)
break;
}free(num);
}int main()
m_out.seekp(0, ios::beg);
m_out.seekp(0, ios::end);
printf("****************************************=\n");
int size = store_vect->size();
float sum = 0;
for (int i = 0; i < size; i++)
}//printf(" 和 : %f\n", sum);
m_out << " 和 : " << sum << endl;
//printf("\n");
}printf("****************************************=\n");
m_out.close();
////clean
int tsize = store_vect->size();
for (int i = 0; i < tsize; i++)
store_vect->clear();
delete store_vect;
store_vect = null;
///return 0;
}
組合的輸出
排列與組合是常用的數學方法,其中組合就是從nn個元素中抽出rr個元素 不分順序且r n 我們可以簡單地將nn個元素理解為自然數1,2,n1,2,n,從中任取rr個數。現要求你輸出所有組合。例如n 5,r 3n 5,r 3,所有組合為 123,124,125,134,135,145,234,235,2...
組合的輸出
題目描述 排列與組合是常用的數學方法,其中組合就是從 n 個元素中抽出 r 個元素 不分順序且 r n 我們可以簡單地將 n 個元素理解為自然數 1,2,n,從中任取 r 個數。現要求你用遞迴的方法輸出所有組合。輸入格式 一行兩個自然數 n,r 輸出格式 所有的組合,每乙個組合佔一行且其中的元素按由...
組合的輸出
問題描述 排列與組合是常用的數學方法,其中組合就是從n個元素中抽出r個元素 不分順序且r n 我們可以簡單地將n個元素理解為自然數1,2,n,從中任取r個數。現要求你用遞迴的方法輸出所有組合。例如n 5,r 3,所有組合為 l 2 3 l 2 4 1 2 5 l 3 4 l 3 5 1 4 5 2 ...