USACO 4.1 Beef McNuggets麦香牛块 DP-数论

不想多说,直接入正题。

题目大意:给出n个数,求用这n个数(数量无限)不能组成的最大的数是多少。若没有上限或所有数都能组成则输出0.

题解:

只要你知道以下的数论结论,这道题就是水背包了:

有两个数p,q,且gcd(q,p)=1,则最大无法表示成px+qy(x>=0,y>=0)的数是pq-q-p(对于n>pq-q-p,都可以表示成px+qy;而pq-q-p,就无法表示成px+qy)。

而且数越多,这个值只会越小。

所以我们只需考虑小于pq-q-p的范围的最小值。对于一些无解的(全体最大公约数>1),或无数解的(有一个‘1’),应提前判断。 其实我们可以干脆全取上界为256*256-256*2。

下面附程序:

const
   maxn=70000;
var
  n,i,s,j,u:longint;
  a:array[1..10] of longint;
  f:array[0..maxn] of boolean;
begin
  readln(n);
  for i:=1 to n do
  begin
    readln(a[i]);
    s:=s+a[i];
  end;
  fillchar(f,sizeof(f),false);
  f[0]:=true;
  for i:=1 to n do
    for j:=a[i] to maxn do
      f[j]:=f[j] or f[j-a[i]];
  for i:=maxn downto 1 do
    if not f[i] then
    begin
      u:=i;
      break;
    end;
  if (u=0)or(u>65024)  
    then writeln(0)
    else writeln(u);
end.


你可能感兴趣的:(USACO 4.1 Beef McNuggets麦香牛块 DP-数论)