题目描述
农民JOHN以拥有世界上最健康的奶牛为骄傲。他知道每种饲料中所包含的的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持他们的健康,使喂给牛的饲料的种数最少。
给出牛所需的最低的维他命,输出喂给牛需要哪些种类的饲料,且所需的种类数最少。
PROGRAM NAME: holstein
INPUT FORMAT
第1行:一个整数V(1<=V<=25),表示需要的维他命的种类数。
第2行:V个整数(1<=每个数<=1000),表示牛每天需要的维他命的最小量。
第3行:一个整数G(1<=G<=15),表示可用来喂牛的饲料的数量。下面G行,第i行表示编号为i饲料包含的各种维他命的量的多少。
SAMPLE INPUT (file holstein.in)
4
100 200 300 400
3
50 50 50 50
200 300 200 300
900 150 389 399
OUTPUT FORMAT
输出文件只有一行,包括:
牛必需的最小的饲料种数P
后面有P个数,表示所选择的饲料编号(按从小到大排列)。
SAMPLE OUTPUT (file holstein.out)
2 1 3
输入
输出
样例输入
样例输出
数据范围限制
这题拖了很久没做,以前以为是某种DP,就没怎么看
然而昨天注意到这个东西:
WTF?
WAIT?g≤15?
O(2^g)的深搜,smg……
代码:
type
arr=array[0..100]of longint;
var
f:array[0..100,0..100]of longint;
n,i,j,v,g:longint;
a,b,c,ans:arr;
procedure search(m,value:longint;ar1,ar2:arr);
var
bz:boolean;
i:longint;
begin
bz:=true;
for i:=1 to v do
if ar1[i]<a[i] then
begin
bz:=false;
break;
end;
if (bz)and(value<n)then
begin
n:=value;
for i:=1 to v do
ans[i]:=ar2[i];
exit;
end;
if m>g then exit;
for i:=1 to v do ar1[i]:=ar1[i]+f[m,i];
ar2[value+1]:=m;
search(m+1,value+1,ar1,ar2);
for i:=1 to v do ar1[i]:=ar1[i]-f[m,i];
ar2[value+1]:=0;
search(m+1,value,ar1,ar2);
end;
begin
readln(v);
for i:=1 to v do
read(a[i]);
readln(g);
for i:=1 to g do
for j:=1 to v do
read(f[i,j]);
n:=maxlongint;
search(1,0,b,c);
write(n,' ');
for i:=1 to n do
write(ans[i],' ');
end.
我承认,这个爆搜不怎么优美
本文介绍了一个饲料组合优化问题,目标是最小化满足奶牛营养需求的饲料种类数量。通过深度优先搜索算法,寻找最少种类的饲料来满足所需维生素的最低标准。
721

被折叠的 条评论
为什么被折叠?



