USACO 5.3 Milk Measuring dfsid+dp

来源:互联网 发布:权力的游戏侏儒知乎 编辑:程序博客网 时间:2024/06/06 07:24

要用到迭代加深搜索(DFSID)。由于要求输出的是使用最少的牛奶桶,所以要先找牛奶桶数量为1的时候所有的组合,如果没有解再找牛奶桶数量为2...直到牛奶桶数量为P。

当搜索到一个组合,判断用这些牛奶桶是否能组成目标解的时候,可以用动态规划的方法来做。设f[i]是当需求的牛奶为i时,能否形成这个组合,是一个布尔型数组。

  • 初始条件 f[0]=true
  • 状态转移方程 f[i]=f[i] or f[ i-v[j] ] (j为使用的所有牛奶桶)
  • 目标状态 f[Q]
  • 如果f[Q]为true,则当前解合法,直接输出即可。
理论上来讲如果数据难一点的话应该是过不了的,但是不知为什么居然过了,还快如闪电。
代码:
{ID: ymwbegi1PROG: milk4LANG: PASCAL}var  deep,n,q,i,j,b1:longint;  a,b:array[0..100] of longint;procedure print;var  i:longint;begin  write(b1);  for i:=1 to b1 do    write(' ',b[i]);  writeln;   close(input);  close(output);  halt;end;procedure work;var  f:array[0..20000] of boolean;  i,j:longint;begin  fillchar(f,sizeof(f),false);  f[0]:=true;  for i:=0 to q-1 do    if f[i] then      for j:=1 to b1 do        if i+b[j]<=q then        begin          f[i+b[j]]:=true;          if i+b[j]=q then print;        end;end;procedure dfs(x:longint);var  i:longint;begin  if b1=deep then  begin    work;    exit;  end;  for i:=x to n do  begin    inc(b1);    b[b1]:=a[i];    dfs(i+1);    dec(b1);  end;end;begin  assign(input,'milk4.in');  assign(output,'milk4.out');  reset(input);  rewrite(output);  readln(q);  readln(n);  for  i:=1 to n do    readln(a[i]);  for i:=1 to n-1 do    for j:=i+1 to n do      if a[i]>a[j] then      begin        a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];      end;  for deep:=1 to n do    dfs(1);  close(input);  close(output);  close(input);  close(output);end.


0 0
原创粉丝点击