题解 P1049 【装箱问题】

· · 题解

 program zhuangxiang2;  
var  
  num,i,rongliang,minleft:longint;  
  v:array[0..30] of longint;  
procedure digui(k,left:longint);  
begin  
  if k>num then begin  
    if left<minleft then begin  
      minleft:=left;  
    end;  
    exit;  
  end;  
  digui(k+1,left);  
  if v[k]<=left then  
    digui(k+1,left-v[k]);  
end;  
begin  
  readln(rongliang);  
  readln(num);  
  for i:=1 to num do  
    read(v[i]);  
  minleft:=maxlongint;  
  digui(1,rongliang);  
  writeln(minleft);  
  readln;  
  readln;  
end.   

话说大家似乎都用动规?完全没必要...... n层递归,每一层两种情况,表示放或不放第k种物品

加限制条件,可AC!