01/10/2018, 08:42

Tìm tất cả các tập con của dãy n phần tử

Em có bài toàn này mong mọi người giúp đỡ
Lập trình C++
TÌM TẤT CẢ CÁC TẬP CON CỦA DÃY N PHẦN TỬ VỚI N NHẬP TỪ BÀN PHÍM: 1, 2, 3, …, n

rogp10 viết 10:46 ngày 01/10/2018

Bài này là bài kinh điển của quay lui/pp sinh, bạn chịu khó google nhé nhiều lắm.

Ngoc Qui viết 10:55 ngày 01/10/2018

mình tìm 1 lúc rồi mà k thấy source code cho bài toán này, bạn biết ko cho mình xin để đọc

Wake Of GOD viết 10:58 ngày 01/10/2018

Có phải bài này là liệt kê ra tập con k của n phần tử ( k <= n ) không?
Bạn có thể tham khảo:

Simple Code C Java

Simple Code C Java: [Bài toán] Liệt kê tập con của tập n phần tử.

bài toán,

Phạm Minh Anh Hữu viết 10:53 ngày 01/10/2018

Bài này đúng ra phải là tìm tất cả các tập con k phần tử từ n phần tử chứ, còn như đề của bạn thì chỉ có 1 tập con duy nhất là: 1, 2, 3,..., n
Và với đề đó, làm theo phương pháp sinh thì:

#include <iostream>

int main() {
	int *element= NULL; //Mảng lưu cấu hình
	int n, k;
	std::cout << "Nhap n: ";
	std::cin >> n;
	std::cout << "Nhap k: ";
	std::cin >> k;
	element= new int[k];
	for(int j = 0; j < k; j++)
        element[j] = j+1; //Set cấu hình ban đầu là 1,2,...,k

    std::cout << "Cac tap con la:\n";
	int index = 0;
	do {
		for(int j = 0; j < k; j++)
			std::cout << element[j]; //In tập con vừa tìm được
		std::cout << std::endl;
		index = k-1;

        //Đoạn bên dưới là sinh các tập hợp theo thứ tự từ điển
		while((index >= 0) && (element[index] == n - k + index + 1))
			index--;

		if(index >= 0) {
			element[index]++;
			for(int j = index+1; j < k; j++)
				element[j] = element[j-1] + 1;
		}
	}while (index != -1);
	delete[] element;
	return 1;
}

Phạm Minh Anh Hữu viết 10:48 ngày 01/10/2018

Các thuật toán kiểu này bạn nên đọc trong quyển Giải Thuật Và Lập Trình - Lê Minh Hoàng

Bài liên quan
0