Usaco 2.1.4 健康的荷斯坦奶牛(Healthy Holsteins)

题目:

 健康的荷斯坦奶牛

来源:

 Usaco2.1.4

题目大意:

 给定V个值,G个方案,求通过最小的方案数使这V个值全为不大于0的数,如果有多  组方案,输出字典序最小的。

数据范围:

 1<=V<=25,1<=G<=15

样例:

 5
 
 
 
 
 
 
 
 
 
 
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1

做题思路:

 Dfs无压力,每个方案只有取或不取两个情况。

知识点:

 dfs

{
ID:Dount Nameless
TASK:holstein
LANG:PASCAL
}
var
 a,ans,b:array[0..30]of longint;
 c:array[0..20,0..30]of longint;
 v,i,j,g,min:longint;
function pd:boolean;{<判断是否满足条件>}
var
 i:longint;
begin
 fori:=1 to v do
  ifa[i]>0 then exit(false);
 exit(true);
end;
procedure dfs(x,h,k:longint);
var
 i:longint;
begin
 if(pd)and(h-1g then exit;{<超出实际最多层数>}
 ifx>g then exit;{<超出实际最多方案数>}
 ifk=1 then
 begin
  b[h]:=x;
  for i:=1 to v do dec(a[i],c[x,i]);
  dfs(x+1,h+1,1);
  dfs(x+1,h+1,0);
  for i:=1 to v do inc(a[i],c[x,i]);
 end;
 ifk=0 then
 begin
  dfs(x+1,h,1);
  dfs(x+1,h,0);
 end;
end;
begin
 assign(input,'holstein.in');reset(input);
 assign(output,'holstein.out');rewrite(output);
 readln(v);
 fori:=1 to v do read(a[i]);
 readln;
 readln(g);
 fori:=1 to g do
 begin
  for j:=1 to v do
   read(c[i,j]);
  readln;
 end;
 min:=maxlongint;
 dfs(1,1,0);dfs(1,1,1);{<第一层为第一个方案时取不取>}
 write(min-1,' ');{<刚开始多算了1>}
 fori:=1 to min-2 do write(ans[i],' ');
 writeln(ans[min-1]);
 close(input);close(output);
end.
题目来源: http://ace.delos.com/usacoprob2?a=YqYGTaSaabV&S=holstein

你可能感兴趣的:(搜索,Usaco)