Hiển thị các bài đăng có nhãn Quay Lui. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Quay Lui. Hiển thị tất cả bài đăng
P142SUME - ROUND 2E - Tập hợp

P142SUME - ROUND 2E - Tập hợp

Link Sub: http://www.spoj.com/PTIT/problems/P142SUME/
Người Gửi: Ok

  • Problem:

Xét tất cả các tập hợp các số nguyên dương có các phần tử khác nhau và không lớn hơn số n cho trước. Nhiệm vụ của bạn là hãy đếm xem có tất cả bao nhiêu tập hợp có số lượng phần tử bằng k và tổng của tất cả các phần tử trong tập hợp bằng s?  
Các tập hợp là hoán vị của nhau chỉ được tính là một.  
Ví dụ với n = 9, k = 3, s = 23, {6, 8, 9} là tập hợp duy nhất thỏa mãn.
Input
Gồm nhiều bộ test (<= 100 test).  
Mỗi bộ test gồm 3 số nguyên n, k, s với 1 ≤ n ≤ 20, 1 ≤ k ≤ 10 và 1 ≤ s ≤ 155.  
Input kết thúc bởi 3 số 0.
Output
Với mỗi test in ra số lượng các tập hợp thỏa mãn điều kiện đề bài.
Example:
Input
9 3 23
9 3 22
10 3 28
16 10 107
20 8 102
20 10 105
20 10 155
3 4 3
4 2 11
0 0 0
Output:
1
2
0
20
1542
5448
1
0
0

  • Solution:

- Bài này số lượng n và k nhỏ ta có thể đệ quy quay lui sinh các trường hợp. 
- Xét tất cả các số từ [x, n] với mỗi số lựa chọn ta xét tiếp các số từ [x+1, n] cho số tiếp theo.... xét cho đến khi đủ k số. Nếu tổng thu được == s ta thực hiện đếm.

  • Code:

C++:



JAVA:


BCCHIANHOM - Chia nhóm

BCCHIANHOM - Chia nhóm

Link Sub: http://www.spoj.com/PTIT/problems/BCCHIANHOM/
Người Gửi: Default

  • Problem:

Cho dãy số A gồm N số (N <= 10) a1, a2, .., an. và một số nguyên dương K(1 < K < N). Hãy đưa ra số cách để chặt dãy số thành K nhóm (các phần tử trong nhóm là liên tiếp) mà các nhóm có tổng bằng nhau.
Input
Dòng đâu tiên bao gồm 2 số nguyên n và k (0 < n <= 12, 0 < k <= n)
Dòng tiếp theo bao gồm n số nguyên a1, a2, …, an (-10000 <= ai <= 10000)
Output
In ra số cách thỏa mãn.
Example:
Input
3 2
-2 0 -2
Output:
2

Input
3 2
1 2 3
Output:
1
  • Solution:

- Sử dụng QHĐ cơ bản: lưu tổng giá trị của mảng trước đó tại mỗi phần tử (arr[i]=arr[i-1]+value) VD: i:1-3 {-2 0 -2} -> arr[]={0 -2 -2 -4} (i:0->3) - Đệ quy - quay lui: + Vì dãy chặt tạo thành các nhóm và tổng số phần tử các nhóm luôn = n -> Nên với mỗi arr[i] sẽ là trường hợp tổng giả sử có thể chặt được. và ta có vt=i; + Với mỗi tổng giả sử có được, ta lặp lại hành động với dãy arr[vt+1->n]; (p/s tổng có từ quy hoạch trên ta có SUM_[i->j] = arr[j]-arr[i-1]).

  • Code:

C++:



JAVA:


BCACM11G - Dãy con tăng dần tự nhiên bậc K

BCACM11G - Dãy con tăng dần tự nhiên bậc K

Link Sub: http://www.spoj.com/PTIT/problems/BCACM11G/
Người Gửi: Dương Lee

  • Problem:

Cho dãy gồm N số phân biệt AN = {a1, a2, .., aN } và số tự nhiên K (K<=N<=100). Ta gọi một dãy con tăng dần bậc K của dãy số AN là một dãy các số gồm K phần tử trong dãy đó thỏa mãn tính chất tăng dần. Bài toán được đặt ra là hãy tìm số các dãy con tăng dần bậc K của dãy số AN.
Input
Dòng đầu tiên ghi số bộ test, không lớn hơn 100. Mỗi bộ test được xây dựng theo khuôn dạng sau:
  • Dòng đầu tiên ghi lại hai số N và K tương ứng với số phần tử của dãy số và bậc của dãy con.
  • Dòng kế tiếp ghi lại N số của dãy số AN, các số trong dãy không lớn hơn 100. 
Output
Với mỗi bộ test, in ra màn hình số các dãy con tăng dần tự nhiên bậc K của dãy số AN
Example:
Input
2
5 3
2 5 15 10 20
5 3
2 20 10 15 5
Output:
7
1

  • Solution:

* Sử dụng đệ quy quay lui: - Đệ quy từng phần tử thứ i của mảng DQ[k]; - Mỗi phần tử đệ quy tiếp tục vào các giá trị có thể (> phần tử trước nó: DQ[i-1]); - Quay lui từng phần tử sau khi đệ quy hết mảng; - Kiểm tra mảng tăng. * Giảm time: - Mỗi phần tử xét các giá trị có thể của nó với điều kiện giá trị xét vào phải > giá trị trước; - Mảng đến được i==k+1 (+ đk_STOP là số phần tử còn lại không đủ để đệ quy tiếp) thì +1;

  • Code:

C++:



JAVA:


BCSINH - Sinh các dãy nhị phân độ dài n (Cơ bản)

BCSINH - Sinh các dãy nhị phân độ dài n (Cơ bản)

Link Sub: http://www.spoj.com/PTIT/problems/BCSINH/
Người Gửi: Dương Lee

  • Problem:

Sinh các dãy nhị phân có độ dài n.

Input
Số nguyên duy nhất n (1<=n<=9)
Output
Mỗi dòng một dãy nhị phân. Các dãy nhị phân phải được liệt kê theo thứ tự từ điển.
Example:
Input
2
Output:
00
01
10
11

  • Solution:

Code C: 
- Sinh Quay Lui: 
+ Cấu hình ban đầu là 0 0 ... 0; 
+ Mỗi phần tử [i] của mảng chỉ nhận 2 giá trị 0 và 1. 
+ Đầu tiên mỗi phần tử sẽ nhận giá trị là 0; 
+ Khi mỗi lần mảng đến giá trị cuối i=n thì in ra và quay lui lại i=n-1 để nhận giá trị tiếp theo là 1 và các phần tử sau quay lại B2. Nếu phần tử i=n-1 đã là giá trị 1 thì tiếp tục lùi i--; 
+ Dưng lại khi đạt cấu hình cuối 1 1 .. 1

  • Code:
C:



C++:



JAVA: