回 帖 发 新 帖 刷新版面

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

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


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

谢谢了!

回复列表 (共7个回复)

沙发

做出了第一道:
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);

3 楼

if s=0 then writeln('Yes');
  writeln;
end.

4 楼

第二个问题是什么意思
能举个例子吗

5 楼

第二题我看明白了
就是找到最小的n使得任意s>=n都能满足
s=7a+11b+13c(*)
我的思路是从14开始repeat往后找
1)对满足条件(*)的第一个数进行定位
2)然后往后进行验证,验证满被定位数后的连续6个数都满足条件(*)就把被定位数打印出来
3)否则继续向后验证至出现下一个可以满足拆分的数,重复1)

6 楼

思路很简单:如果连续6个数都可拆,那么到第7个只要把原数拆法+7就肯定可拆
最后我已经手动计算出结果了。最小的是31(30是最大的不可拆),而56以后都可以通过简单变换加以验证

7 楼

具体实践中可以用递归来验证一个数能否被合理拆分

我来回复

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