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

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

1 Like

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

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:

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;
}

1 Like

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

1 Like

dù biết bài hỏi lâu rồi nhưng vẫn để code của mình ở đây cho các bạn đến sau tham khảo:

#include <stdio.h>
void try(int i, int m, int *s, int n) {
	int z;
	for(z=s[i-1] + 1; z<=n; z++) {
		s[i] = z;
		if(i==m) {
			int k;
			for(k=1; k<=m; k++) {
				printf("%d", s[k]);
			}
			printf("\n");
		}
		else {
			try(i+1, m, s, n);
		}
	}
}
int main()
{
	int n;
	printf("Nhap n: ");
	scanf("%d", &n);
	int s[n+1];
	s[0] = 0;
	int i;
	for(i=0; i<=n; i++) {
		printf("Cac tap con %d phan tu la:\n", i);
		try(1, i, s, n);
		printf("\n");
	}
	return 0;
}
2 Likes
//tim tat ca tap con n vd: 0 1 2 => {0}; {1} ; {2} ; {0, 1} ; {0, 2} ; {1, 2} ; {0; 1; 2}
#include <iostream>
using namespace std;
int n;
int x[100];
int a[100];
int b[100];
void Printf(int k)
{
    for (int i = 1; i <= k; ++i)
    {
        cout<<x[i]<<" ";
    }
    cout<<endl;
}
void Try(int i)
{
    for (int j = i; j <= n; ++j)
    {
        if(b[j]==true)
        {
            x[i] = a[j];
            b[j] = false;
            if(i==i)Printf(i);
            Try(i+1);
            if(i!= 1) b[j]=true;
        }
    }
}
int main() {
    fill(b,b+sizeof(x)/sizeof(x[0]),1);
    cin>>n;
    for (int i = 1; i <= n; ++i)
    {
        cin>>a[i];
    }
    Try(1);
    return 0;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?