Nguồn đề bài: http://www.spoj.com/ACMPTIT/problems/P151SUMB/
1. Đề bài P151SUMB spoj
Tuyenlv7 bị mẹ giao cho nhiệm vụ đó là đong gạo để mang lên nhà trọ. Anh được mẹ đưa cho 2 loại bịch, là loại 5 kg và 3 kg. Tuyenlv7 sẽ phải đong đủ số gạo mà mẹ cho vào 2 loại bịch trên.
Ví dụ mẹ cho 18 kg thì Tuyenlv7 có thể đong bằng 3 bịch 5kg + 1 bịch 3kg hoặc 6 bịch 3 kg.
Hãy giúp anh ấy đong với số lượng bịch ít nhất có thể, nếu không thể đong được, in ra -1.
Input
Dòng duy nhất chứ số N là số gạo mẹ Tuyenlv7 cho ( 0 < N < 5000).
Output
In ra đáp án của bài toán.
Example
Input:
18
Output:
4
2. Code tham khảo P151SUMB spoj PTIT
const fi='';
x:array[1..2] of byte=(3,5);
type data=longint;
var
f:text;
n,k,res,s,sl:data;
ok:boolean;
function min(a,b:data):data;
begin
if a<b then exit(a); exit(b);
end;
procedure try(i:data);
var j,w:data;
begin
w:=n;
if i>2 then
begin
if n=0 then
begin
res:=min(res,sl);
ok:=true;
end;
end
else
for j:=W div x[i] downto 0 do
begin
inc(sl,j);
n:=n-x[i]*j;
try(i+1);
n:=n+x[i]*j;
dec(sl,j);
end;
end;
begin
assign(f,fi); reset(f);
readln(f,n);
close(f);
sl:=0;
ok:=false;
res:=high(data);
try(1);
if ok then
writeln(res)
else
writeln(-1);
end.
bạn có thể đưa ra ý tưởng từng bài được không?
mình k quen đọc code pascal
thanks!
bái này xử dụng quay lui bạn ạ 😀 cách xử lí bài này bằng div sẽ cho kq sai ở test “11” nên trong bài này mình nghĩ quay lui đặt cận là ổn nhất. 😀
Bài này còn cách làm khác: Chạy i (số bịch 5kg) từ n div 5 về 0, kiểm tra xem có thể nhét số gạo còn lại vào các bao 3kg hay không ((n-i*5) mod 3 = 0), nếu có thì trả về kết quả là i + (n-i*5) div 3.
Code: http://ideone.com/Z2HnsM
cảm ơn bạn đã đóng góp 😀
Cho em hỏi cách này có đúng ko ạ: em sử dụng QHĐ, khởi tạo mảng F>5000; F[n]=0. chạy i từ n-1 về 1: F[i]=min(F[i+5],F[i+3])+1. nếu F[0]>5000 thì in ra -1, ngược lại in ra F[0].
Mình nghĩ làm bằng QHD theo cách bạn có thể đúng nha. 😀 mà bạn xây hàm QHD bị ngược thì phải
cách này nhanh hơn này mấy bác
#include
#include
using namespace std;
int main()
{
int minx = 9999;
int s;
cin >> s;
for(int i = s/5; i>=0; i–){
if((s-2*i)/3 < minx){
minx = (s-2*i)/3;
}
}
cout << minx;
return 0;
}