Downloaded by tailieu schat tailieuschat@gmail.comlOMoARcPSD|38482106... Downloaded by tailieu schat tailieuschat@gmail.comlOMoARcPSD|38482106... Downloaded by tailieu schat tailieuschat
Trang 1BÀI T P L N Ậ Ớ
- Nhóm 5, t 6 ổ
-3 BT2-VD6
* Đ bài ề : Cho dãy s A = (aố 1, a2, …, an) và s t nhiên P Hãy ố ự
li t kê t t c các dãy con k ph n t c a dãy A sao cho t ng ệ ấ ả ầ ử ủ ổ các ph n t c a dãy con đó đúng b ng P.ầ ử ủ ằ
Ví d : A = (5, 10, 15, 20, 25, 30, 35), n = 7, k = 3, P = 50 ta có ụ các dãy con sau:
(5, 10, 35),
(5, 20, 25),
(10, 15, 25),
…
* L u đ thu t toán ư ồ ậ
Downloaded by tailieu schat (tailieuschat@gmail.com)
lOMoARcPSD|38482106
Trang 3Downloaded by tailieu schat (tailieuschat@gmail.com)
lOMoARcPSD|38482106
Trang 5Downloaded by tailieu schat (tailieuschat@gmail.com)
lOMoARcPSD|38482106
Trang 7Downloaded by tailieu schat (tailieuschat@gmail.com)
lOMoARcPSD|38482106
Trang 8#include <bits/stdc++.h>
using namespace std;
#de昀椀ne MAX 100
// khởi tạo các giá trị
int a[MAX], n, k, dem = 0, p;
int v[MAX];
// khoi tao mang luu cac gia tri
vector<vector<int>> ve;
// điều kiện dừng
bool ok = true;
// kiểm tra mảng a xem có tổng các phần tử bằng p hay ko bool kiemtra(int a[], int k)
{
int sum = 0;
for (int i = 1; i <= k; i++)
{
Trang 9sum += v[a[i]];
}
return (sum == p);
}
// Thiết lập cấu hình đầu 琀椀ên xắp xếp mảng theo thứ tự tăng dần
void Init()
{
cout << "Nhap so luong phan tu n : \n" ; cin >> n;
cout << "Nhap so p : \n"; cin >> p;
cout << "Nhap day con k : \n"; cin >> k;
cout << "Nhap cac phan tu cua mang v : \n";
for (int i = 1; i <= n; i++)
{
cin >> v[i];
}
// sắp xếp mảng tăng dần từ
sort(v+1,v+n+1);
Downloaded by tailieu schat (tailieuschat@gmail.com)
lOMoARcPSD|38482106
Trang 10// lưu vị trí vào mảng a
for (int i = 1; i <= k; i++)
{
a[i] = i;
}
}
// cập nhật cấu hình hiện tại nếu thỏa mãn tổng bằng p và biến đếm tăng dần
void Result()
{
if (kiemtra(a, k))
{
// cout << "\nKet qua " << ++dem << ": ";
dem++;
vector<int> tmp;
for (int i = 1; i <= k; i++)
{
// cout << v[a[i]] << " ";
tmp.push_back(v[a[i]]);
Trang 11}
// cout << endl;
ve.push_back(tmp);
}
}
// Sinh ra tập con k phần tử
void Next_Combina琀椀on()
{
int i = k;
// xuất phát từ vị trí k
while (i > 0 && a[i] == n - k + i) // xác định chỉ số để a[i] != n -
k + i;
{
i ;
}
if (i > 0) // nếu chưa phải tổ hợp cuối cùng
{
a[i]++;
// thay đôỉ tăng chỉ số thêm 1
Downloaded by tailieu schat (tailieuschat@gmail.com)
lOMoARcPSD|38482106
Trang 12for (int j = i + 1; j <= k; j++)
{
a[j] = a[j - 1] + 1; // các vị trí từ i - 1 đến k cộng thêm 1 chỉ
số
}
}
else
// điều kiện dừng khi đạt cấu hình cuối cùng
ok = false;
}
void Full_At()
{
cout << "\nSo cau hinh thoa man la : " << dem << endl; int z = 0;
// in ra các cấu hình thỏa mãn
for(auto x : ve)
{
cout << "\nCau hinh " << ++z << ": ";
for(int i=0; i<k; i++)
Trang 13{
cout << x[i] << " ";
} cout << endl;
}
if(dem == 0) cout << "khong co gia tri thoa man!"; }
int main()
{
Init();
// khởi tạo các gía trị cần thiết
while (ok)
{
Result();
Next_Combina琀椀on();
}
Full_At();
return 0;
}
Downloaded by tailieu schat (tailieuschat@gmail.com)
lOMoARcPSD|38482106
Trang 14* K t qu ế ả:
VD: N = 7, K = 3, P = 50, dãy N ph n t : ầ ử 5, 10, 15, 20, 25, 30, 35
Trang 15Downloaded by tailieu schat (tailieuschat@gmail.com)
lOMoARcPSD|38482106