Professional Documents
Culture Documents
Lý thuyết TRR1 PTIT
Lý thuyết TRR1 PTIT
2. Sinh tổ hợp
- Một xâu biểu diễn tổ hợp chập k của n có dạng X = (x1,x2,…,xk).
- Cấu hình đầu tiên: (1,2,…,k) – cấu hình cuối cùng: (n-k+1, n-k+2,…, n).
- Cấu hình X = (x1,…,xk) được gọi là đứng trước cấu hình Y = (y1,…,yk) nếu
tồn tại chỉ số t thỏa mãn: x1 = y1, x2 = y2, …, xt-1 = yt-1, xt < yt.
❖ Phương pháp:
- Giả sử cấu hình hiện tại là X = (x1,x2,…,xk).
- Nếu X là cấu hình cuối cùng, thuật toán kết thúc.
- Tìm xi là phần tử đầu tiên tính từ bên phải của X mà xi ≠ n – k + i.
- Thay xi bởi xi + 1.
- Thay xj bằng xi + j – i, với j = i + 1, i + 2,…, k.
❖ Viết hàm:
void sinh()
{
for(int i = 1; i <= k; i++) x[i] = i;
while(1)
{
for(int i = 1; i <= k; i++) cout << x[i];
cout << endl;
int i = k;
while(x[i] == n - k + i && i > 0) i--;
if(i == 0) break;
else
{
x[i]++;
for(int j=i+1; j<=k; j++) x[j] = x[j-1] + 1;
}
}
}
3. Sinh hoán vị
- Một xâu biểu diễn hoán vị của n có dạng X = (x1,x2,…,xn).
- Cấu hình đầu tiên: (1,2,…,n) – cấu hình cuối cùng: (n, n-1,…, 1).
- Cấu hình X = (x1,…,xn) được gọi là đứng trước cấu hình Y = (y1,…,yn) nếu
tồn tại chỉ số t thỏa mãn: x1 = y1, x2 = y2, …, xt-1 = yt-1, xt < yt.
❖ Phương pháp:
- Giả sử cấu hình hiện tại là X = (x1,x2,…,xn).
- Nếu X là cấu hình cuối cùng, thuật toán kết thúc.
- Tìm xi là phần tử đầu tiên tính từ bên phải của X mà xi < xi+1.
- Tìm xj nhỏ nhất mà còn lớn hơn xi trong các số bên phải xi.
- Đổi chỗ (xi, xj).
- Lật ngược đoạn từ xi+1 đến xn.
❖ Viết hàm:
void sinh()
{
for(int i = 1; i <= n; i++) x[i] = i;
while(1)
{
for(int i = 1; i <= n; i++) cout << x[i];
cout << endl;
int i = n - 1;
while(x[i] > x[i+1] && i > 0) i--;
if(i == 0) break;
else
{
int j = n;
while(x[j] < x[i]) j--;
swap(x[i], x[j]);
int l = i + 1, r = n;
while(l <= r)
{
swap(x[l], x[r]);
l++; r--;
}
}
}
}
Branch_And_Bound(k)
{
for(akAk)
if(<chấp nhận ak>)
{
Xk = ak;
if(k == n) <Cập nhật kỉ lục>;
else if(g(x1,x2,…,xk) < FOPT) Branch_And_Bound(k+1);
}
}