[题目描述]
Healthy Holsteins
健康的好斯坦奶牛
农民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
[解题思路]
直接回溯裸枚,2^15裸过...
[Code]
{
ID: zane2951
PROG: holstein
LANG: PASCAL
}
program holstein;
var
w:array[0..51,0..51] of longint;
v,q,qq:array[0..51] of longint;
ans,n,m,i,j,top:longint;
//---------check-----------
function check:boolean;
var
i,j,ce:longint;
begin
for i:=1 to n do
begin
ce:=0;
for j:=1 to top do ce:=ce+w[q[j],i];
if cev[i] then exit(false);
end;
exit(true);
end;
//----------dfs------------
procedure dfs(dp:longint);
begin
if dpm then
begin
if check and (topans) then begin ans:=top; qq:=q; end;
exit;
end;
inc(top); q[top]:=dp; dfs(dp+1);
dec(top); dfs(dp+1);
end;
//----------main-----------
begin
assign(input,'holstein.in'); reset(input);
assign(output,'holstein.out'); rewrite(output);
readln(n);
for i:=1 to n do read(v[i]);
readln(m);
for i:=1 to m do
for j:=1 to n do read(w[i,j]);
ans:=maxlongint; top:=0;
dfs(1);
write(ans);
for i:=1 to ans do write('':1,qq[i]);
writeln;
close(input); close(output);
end.