em đang giải bài toán liệt kê các tổ hợp chập k của n phần tử
dùng thuật toán quay lùi nhưng mà vẫn chưa ra kết quả
các anh có thuật toán giúp giùm em
em cảm ơn !
em đang giải bài toán liệt kê các tổ hợp chập k của n phần tử
dùng thuật toán quay lùi nhưng mà vẫn chưa ra kết quả
các anh có thuật toán giúp giùm em
em cảm ơn !
anh cũng đang bí ne`
hôm nào anh làm xong thì share cho
đợi nghe
Đây là thuật toán chung chung, từ đây bạn phát triển theo bài tập của bạn nhé. (hy vọng ko bị sai chỗ nào )
void Try(i){
for(j = cận dưới đến cận trên){
if (chấp nhận j){
Lưu trạng thái cũ và chuyển sang trạng thái mới.
xi được tính theo trạng thái j
if (x1..xi là nghiệm)
In kết quả.
else
Try(i+1)
Trả lại trạng thái cũ.
}
}
}
cách làm như sau (ko đệ quy)
vd tìm tổ hop cap 3 cua 12345
liet ke theo thứ tự tăng dần
123
124
125
134
135
....
bạn tự viet source nhen (viet 1 hàm tim cấu hình tiep theo)
[ Thanhhuy191188@gmail.com]
Minh co CODE muon share cho các bạn cùng tham khảo . nhưng cái chính là đoạn hướng dẫn bên trên. dựa vào đó ta có thể giải quyết được nhiều bài toán khác ,...
/////////////////////////////
// chinh hop lap chap k phan tu n mu k
#include<stdio.h>
#include<conio.h>
void write();
void try1(int i);
int x[30];
int n,k;
void write()
{
int i;
FILE *f2;
f2=fopen("nchapk.out","a");
for(i=1;i<=k;i++)
{
fprintf(f2,"%d",x[i]);
}
fprintf(f2,"\n");
fclose(f2);
}
void try1(int i)
{
int j;
for(j=0;j<=n;j++)
{
x[i]=j;
if(i==k)
write();
else try1(i+1);
}
}
void main()
{
FILE *f1;
f1=fopen("nchapk.inp","r");
fscanf(f1,"%d %d",&n,&k);
try1(1);
fclose(f1);
}
//////////////////////////////////////////
đệ quy way lui...
chẳng khác với đệ qyu đâu...
nói chung nó là zậy...
procedure try (...);
var...;
begin
if (đk) then exit (đúng thì thoát)
else
begin
try(..);
try(..);
(đoạn này để đệ quy vô lần nữa)
(trả lại thiết lập ban đầu trước khi đệ quy vô);
end;
end;
ý nghĩa
khi gặp một lối đúng thì thoát;
không thì đệ quy vô
gặp đướng cụt thì way ra bằng cách trả thiết lập lại
Ví dụ: bài mã đi tuần
Bài toán tìm tổ hợp chập k trong n phần tử theo phương pháp quay lui:
try(i):=
for (j = 1; j <= n; j++)
if(x[i-1] + 1 <= j <= n - k + i)
{
x[i] = j;
if (i < k)
try(i + 1);
else
Xuất(x);
}
Viết chương trình trò chơi cờ vua mà dùng thuật toán quay lui thì viết sao mọi người! Giúp mình với nha!
Được sửa bởi knattanwar lúc 18:02 ngày 11-04-2009
Bookmarks