PDA

View Full Version : Có bài này không biết có ai muốn giúp đệ không !



khôngtên
11-02-2003, 18:44
Bác nào có cao kiến gì giúp em với ! Bài khó qué !Nuôi bò khỏe mạnh:
Nuôi bò khoẻ mạnh (Theo đệ phải là nuôi dê mới đúng he he !)
Bác nông dân John hãnh diện về đàn bò khoẻ mạnh của ông. Ông biết lượng vitamin chứa trong một xô của mỗi loại thức ăn và nhu cầu tối thiểu về lượng vitamin hằng ngày cho bò. Công việc của bạn là giúp ông John tiếp tục nuôi bò khỏe mạnh, trong khi dùng ít xô thức ăn nhất để nuôi bò.
Cho trước: nhu cầu hằng ngày của mỗi loại vitamin cho bò. Hãy xác định số xô thức ăn ít nhất để cung cấp lượng vitamin tối thiểu để nuôi một con bò.
Lượng vitamin được đo bằng các số nguyên. Những con bò có thể được nuôi bằng một xô thức ăn của một loại bất kì. Dữ liệu input luôn có lời giải.

Input:
Dòng 1: chứa số nguyên V (1<=V<=25) là mỗi loại vitamin.
Dòng 2: chứa V số nguyên (1<=mỗi số<=1000) là nhu cầu tối thiểu của mỗi loại trong V loạI vitamin mà một con bò cần mỗi ngày.
Dòng 3: chứa số nguyên G (1<=G<=1000) là loại thức ăn.
Từ dòng 4 đến dòng G+3, mỗi dòng có V số nguyên (0<=mỗi số<=1000) là số lượng của mỗi vitamin chứa trong một xô thức ăn. Dòng đầu của G dòng này chỉ thức ăn thứ nhất, dòng 2 chỉ thức ăn thứ 2, và….

Input mẫu (file INPUT.TXT):
4
100 200 300 400
3
50 50 50 50
200 300 200 300
900 150 389 399

Output:
Chỉ có một dòng chứa:
+ Số xô ít nhất mà một con bò phải ăn, theo sau là: Một danh sách có thứ tự (tăng dần) các loại thức ăn.

OUTPUT.TXT
2 1 3
(Có thể có nhiều lời giải chỉ cần chọn ra 1 lời giải).

skywalker
14-02-2003, 20:42
tui biet thuat toan bai nay, nhung ma truoc tien cho tui to mo chut: bac dang hoc o dau vay

khôngtên
16-02-2003, 17:53
Mình ở Hội An. Chắc bạn biết chứ ? Mình rất mong bạn giúp mình ! Cảm ơn nhiều nhé !

Junior IT
16-02-2003, 20:34
Bạn lấy đề này trên mạng?

khôngtên
18-02-2003, 18:28
Không mà là thầy cho. Nếu bác biết down ở đâu cho em địa chỉ được không !? Còn bác nào biết thuật toán bài này thì có thể giúp em được không !

khôngtên
22-02-2003, 18:24
Sao ế vậy ! Bà con ơi mọi dzô !

hiensmart
22-02-2003, 19:39
Tôi chỉ có source C ko biết bạn xài đc ko?
Bài đó là đề USACO, tựa là "healthy holsteins"

hiensmart
22-02-2003, 19:40
Wên gửi file
#include <stdio.h>
#include <mem.h>
void Input();
void Process();
void Output();
int VitaminCount, FeedCount;
int MinVit[25];
int Feed[15][25];
int Amount[25];
int Result;
void main()
{ Input();
Process();
Output();
} // main
void Input()
{ FILE * fin;
fin = fopen("input.txt", "r");
fscanf(fin, "%u", &VitaminCount);
for(int i=0;i<VitaminCount;i++)
fscanf(fin, "%u", &MinVit[i]);
fscanf(fin, "%u", &FeedCount);
for(i=0;i<FeedCount;i++)
for(int j=0;j<VitaminCount;j++)
fscanf(fin, "%u", &Feed[i][j]);
fclose(fin);
} // Input
void Output()
{ unsigned cnt = 0, Res;
FILE * fout;
fout = fopen("output.txt", "w");
Res = Result;
for(int i=0;i<FeedCount;i++)
{ if(Res & 1)
cnt ++;
Res >>= 1;
}
fprintf(fout, "%u ", cnt);
Res = Result;
for(i=0;i<FeedCount;i++)
{ if(Res & 1)
{ cnt --;
if(cnt > 0)
fprintf(fout, "%u ", i+1);
else
fprintf(fout, "%u\n", i+1);
}
Res >>= 1;
}
fclose(fout);
} // Output
int OK(unsigned a)
{ int i, j;
memset(Amount, 0, 25*2);
for(i=0;i<FeedCount && (a > 0);i++)
{ if(a & 1)
for(j=0;j<VitaminCount;j++)
Amount[j] += Feed[i][j];
a >>= 1;
}
for(j=0;j<VitaminCount;j++)
if(Amount[j] < MinVit[j])
return 0;
return 1;
} // OK
int Count(unsigned a)
{ int C = 0;
while(a > 0)
{ if(a & 1)
C ++;
a >>= 1;
}
return C;
} // Count
void Process()
{ unsigned Max = 1 << FeedCount, cnt, MinCount = 1000;
for(unsigned i=0;i < Max;i++)
{ if((cnt=Count(i)) < MinCount && OK(i))
{ Result = i;
MinCount = cnt;
}
}
} // Process

khôngtên
26-02-2003, 17:55
Cảm ơn bác nhiều !

skywalker
27-02-2003, 05:09
thuật toán chắc là giống bài chia kẹo đó