該題的公式版暫時還沒弄出來,感覺是應該可以按照排列組合弄出來的。下面給出程序版的
第一種思想:
把所有8位以內的二進制數循環一次,對於每一個二進制數的每一位,從高到低依次相加,其中遇到0的話加-1,遇到1加1,每次加的結果需要大於等於0
加完所有位的結果應該為0,滿足兩個條件的即是一種組合
第二種思想:
我們可以用生成二叉樹的方法解決,重新定義一個數據結構,數據結構如下:
struct Node{
int data;//0或1
int num0;//0出現的次數
int num1;//1出現的次數
struct Node* lchild;
struct Node* rchild;
};
同時我們需要用一個隊列保存葉子節點的指針,目的是為了降低時間復雜度
步驟如下:
(1)用元素1生成根節點,同時num1++,num0=0,lchild=NULL,rchld=null;把該節點入隊列
(2)從隊列取隊首元素,比較num1和num0的大小,當num1=4的時候節點不再增加;如果num1大於num0,則為該節點生成生成左右孩子,左孩子data=1,num0=父節點num0;num1=父節點num1+1;右孩子data=0,num0=父節點num0+1,num1=父節點num1;
如何num1=num0,只增加一個左孩子1,同時新增加的節點入隊列
(3)重復步驟(2)知道隊列為空
(4)統計葉子節點的個數即是結果