0
0
Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
2378
1794
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!
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin
0
5
0
qhđ à
2378
47178
1794
Vâng ạ
0
5
0
giải thích cho mình được không .-.
2378
47178
1794
Mình giải thích rồi ạ