Description
农民JOHN以拥有世界上最健康的奶牛为骄傲。他知道每种饲料中所包含的的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持他们的健康,使喂给牛的饲料的种数最少。
给出牛所需的最低的维他命,输出喂给牛需要哪些种类的饲料,且所需的种类数最少。
Input
第1行:一个整数V(1<=V<=25),表示需要的维他命的种类数。
第2行:V个整数(1<=每个数<=1000),表示牛每天需要的维他命的最小量。
第3行:一个整数G(1<=G<=15),表示可用来喂牛的饲料的数量。下面G行,第i行表示编号为i饲料包含的各种维他命的量的多少。
Output
输出文件只有一行,包括:
• 牛必需的最小的饲料种数P
• 后面有P个数,表示所选择的饲料编号(按从小到大排列)。
末尾有空行
题解
就一个dfs,水了。
Executing…
Test 1: TEST OK [0.000 secs, 340 KB]
Test 2: TEST OK [0.000 secs, 340 KB]
Test 3: TEST OK [0.000 secs, 340 KB]
Test 4: TEST OK [0.000 secs, 340 KB]
Test 5: TEST OK [0.000 secs, 340 KB]
Test 6: TEST OK [0.000 secs, 340 KB]
Test 7: TEST OK [0.000 secs, 340 KB]
Test 8: TEST OK [0.000 secs, 340 KB]
Test 9: TEST OK [0.011 secs, 340 KB]
Test 10: TEST OK [0.011 secs, 340 KB]
All tests OK.
代码
{
ID: zyx52yzl
LANG: PASCAL
TASK: holstein
}
var
m,n,l,tot,min:longint;
a:array [0..31]of longint;
ans,tmp:array [0..20]of longint;
f:array [0..20,0..31] of longint;
procedure init;
var
i,j:longint;
begin
readln(n);
for i:=1 to n do
read(a[i]);
readln(m);
for i:=1 to m do
for j:=1 to n do
read(f[i,j]);
tot:=0;
min:=maxlongint;
end;
function check:boolean;
var
i:longint;
begin
for i:=1 to n do
if a[i]>0 then exit(false);
exit(true);
end;
procedure dfs(k:longint);
var
i:longint;
begin
if (check) and (tot<min) then
begin
ans:=tmp;
min:=tot;
end;
if k>m then exit;
inc(tot);
tmp[tot]:=k;
for i:=1 to n do
a[i]:=a[i]-f[k,i];
dfs(k+1);
dec(tot);
for i:=1 to n do
a[i]:=a[i]+f[k,i];
dfs(k+1);
end;
procedure print;
var
i:longint;
begin
write(min,' ');
for i:=1 to min-1 do
write(ans[i],' ');
writeln(ans[min]);
end;
begin
assign(input,'holstein.in');
assign(output,'holstein.out');
reset(input);
rewrite(output);
init;
dfs(1);
print;
close(input);
close(output);
end.