回 帖 发 新 帖 刷新版面

主题:一道难题

一道难题——做对有分加!

题目:店里有3种规格的子弹盒,分别装有13,11,7粒子弹。如果有人要买20粒子弹,那么就不必拆开盒子(13粒盒的加7粒盒的),如果要买23粒子弹,就必须拆开盒子卖。
试编程序,求:
(1)键盘输入要买的子弹数w,确定要卖w粒子弹是否要拆开,若要,则打印'yes',若不要,则打印装有13,11,7粒子弹的盒各要卖多少盒。
(2)找出一个最小的数,凡是来买子弹的数目超过这个数时,肯定不必拆开盒子!


用PASCAL算最好,也可以用数学算法解答(一样+分)!

谢谢了!
  [em2]

回复列表 (共1个回复)

沙发

做出了第一道:
program yb(input,output);
const kindof:array[1..3]of integer=(13,11,7);
       max=1000;
var z:array[1..max]of integer;
     jl:array[1..3]of integer;
     n:integer;
     s:integer;
procedure search(step:integer;v:integer);
  procedure print;
   var i:integer;
       a,b,c:integer;
    begin
     a:=0;
     b:=0;
     c:=0;
     for i:=1 to step-1 do
      if z[i]=13 then inc(a)
      else if z[i]=11 then inc(b)
      else inc(c);
     writeln(13,' ',a);
     writeln(11,' ',b);
     writeln(7,'  ',c);
     inc(s);
    end;
var i:integer;
  begin
   if v=0 then begin print;exit;end;
   if (v>0)and(s<1) then
    begin
     for i:=1 to 3 do
      begin
       inc(jl[i]);
       z[step]:=kindof[i];
       search(step+1,v-kindof[i]);
      end;
    end;
  end;
begin
  s:=0;
  read(n);
  search(1,n);
  if s=0 then writeln('Yes');
  writeln;
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册