#include #include using namespace std; // tìm các số nhị phân có độ dài k và có n số 1 void bai_10(int value, int length, int count, int n, int k) { // độ dài lớn hơn cần thiết thì kết thúc if (length > n) { return; } // số số 1 lớn hơn cần thiết thì kết thúc if (count > k) { return; } // độ dài và số chữ số 1 đúng yêu cầu thì in nó ra // vì độ dài đã đạt đến mức cần thiết nên ta thoát nó luôn if (length == n && count == k) { // in value ra với độ dài là n, nếu độ dài số < n thì chèn 0 vào trước cout << setfill('0') << setw(n) << value << endl; return; } // tiếp tục chèn thêm số 0 vào cuối chuỗi số. Ở đây anh dùng nhân 10 bai_10(value * 10, length + 1, count, n, k); // chèn thêm số 1 vào cuối (nhân 10 + 1). thêm số 1 thì phải tăng biến count lên 1 đơn vị bai_10(value * 10 + 1, length + 1, count + 1, n, k); } void main() { int n = 4; int k =2; // số hiện tại là 0, có độ dài là 1 và số số 1 là 0 bai_10(0, 1, 0, n, k); // số hiện tại là 1, có độ dài là 1 và số số 1 là 1 bai_10(1, 1, 1, n, k); }