GIÚP MÌNH VỚI Cho dãy số gồm n số tự nhiên a1, a2, ... , an (1 nhỏ hơn bằng i nhỏ hơn bằn n < 1000, a1 <10000). Dãy con của một dãy số là dãy có được sau khi loại bớt một số phần tử, các phần tử khác giữ nguyên vị trí. Yêu cầu: Cho số tự nhiên m <10000, hãy cho biết một dãy con của dãy a có tổng bằng m chứa ít phần tử nhất. Dữ liệu vào từ file: DAYCON.INP - Dòng 1: Chứa hai số n, m - Dòng 2: Chứa n số a1, a2, ... , an theo đúng thứ tự đó. Kết quả ghi ra file: DAYCON.OUT - Dòng 1: Ghi số k là số phần tử của dãy con chọn ra được, nếu không tồn tại dãy con có tổng bằng m thì ghi số -1. - Nếu có phương án chọn dãy con, thi dòng 2 ghi chỉ số của k phần tử được chọn (ghi theo thứ tự của phần tử trong dãy). Các số trên một dòng của file dữ liệu vào và file ghi kết quả được ghi cách nhau ít nhất một dấu cách.
2 câu trả lời
const fi='daycon.inp';
fo='daycon.out';
maxn=round(1e5)+5;
var n,s,i,j,sum,k,dem,tong:longint;
a,dem: array [1..maxn] of longint;
procedure nhap;
var i:longint;
begin
assign(input,fi);
reset(input);
readln(n,m);
for i:=1 to n do
readln(a[i]);
close(input);
end;
type
tlist = array[1..max] of longint;
procedure qsortAB(var a,b : tlist);
procedure sort(l,r: longint);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=a[(l+r) div 2];
while(i<=j) do
begin
while a[i]<x do
inc(i);
while x<a[j] do
dec(j);
if not(i>j) then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
y:=b[i]; b[i]:=b[j]; b[j]:=y;
inc(i);
j:=j-1;
end;
end;
if l<j then
sort(l,j);
if i<r then
sort(i,r);
end;
begin
sort(1,max);
end;
procedure xuly;
var c:longint;
begin
for i:=1 to n do
begin
sum:=i;
for j := i+1 to n-1 do
begin
if (sum<m) then sum:=sum+a[j]
else if (sum>m) then begin sum :=0; break; end
else if (sum = m) then begin k:=k+1; a[k]:=a[j]; break; end;
end;
end;
end;
procedure xuat;
begin
assign(output,fo);
rewrite(output);
if k=0 then write(-1);
for i:=1 to k do
begin
tong:=0;
while tong<m do
begin
dec(a[i]);
tong:=tong+a[i];
inc(dem);
end;
end;
write(dem);
close(output);
end;
begin
nhap;
xuly;
xuat;
end.