◉ Đề: Nhập n,k và mảng arr[n] từ bàn phím. Kiểm tra xem từ các phần tử trong mảng ta có thể tạo thành tổng bằng k hay không. Xuất ra màn hình số phần tử ít nhất để tạo thành tổng k.
◉ Dữ liệu vào:
– Dòng đầu tiên ghi số nguyên dương n.
– Dòng thức 2 ghi tổng k.
– Các số trong dãy có giá trị không vượt quá 100.000
◉ Ví dụ:
INPUT OUTPUT
5 |
12 | 5
1 3 4 3 1 |
———————————————
7 |
7 | 1
1 6 7 2 4 3 5 |
◉ Ràng buộc:
– Có 40% số test có 0
◉ Đề: Nhập n,k và mảng arr[n] từ bàn phím. Kiểm tra xem từ các phần tử trong mảng ta có thể tạo thành tổng bằng k hay không. Xuất ra màn hình số phần
By Skylar
uses crt;
var i,n,k,j,max:longint; a,l,t:array[1..1000000]of longint;
begin
clrscr;
write(‘n=’);readln(n);
write(‘k=’);readln(k);
for i:=1 to n do
begin
write(‘a[‘,i,’]=’);readln(a[i]);
end;
max:=high(longint);
for i:=n downto 1 do
begin
t[i]:=n+1;
for j:=i to n do
if (a[i]+l[j]>=l[i])and(t[j]+1<=t[i])and(a[i]+l[j]<=k) then begin t[i]:=0; l[i]:=l[j]+a[i]; t[i]:=t[j]+1; end;
if t[i]=n+1 then begin l[i]:=a[i]; t[i]:=1; end;
if (l[i]=k)and(t[i]<max) then max:=t[i];
end;
writeln(max);
readln
end.
/////////////////////////////////////
Giải thích:
Dãy l[i] là mình đánh dấu tổng tổng nó sẽ là l[j]+a[i];
Các chạy:
Chạy i từ n xuống 1
Chạy j từ i đến n
Nếu thấy l[j] nào mà nó cộng với a[i]<=k thì khi đó l[i] sẽ là l[j]+a[i]; còn t[i] thì tăng lên 1
Nếu không thấy l[j] nào phù hợp thì l[i]=a[i]; t=1
t[i] là dãy mà mình sẽ xem bao nhiêu số để mình tạo thành k
Cuối cùng ta tìm max trong dãy t là được!