主题:一道难题——做对有分加!
我是严天雯
[专家分:110] 发布于 2006-12-08 16:42:00
题目:店里有3种规格的子弹盒,分别装有13,11,7粒子弹。如果有人要买20粒子弹,那么就不必拆开盒子(13粒盒的加7粒盒的),如果要买23粒子弹,就必须拆开盒子卖。
试编程序,求:
(1)键盘输入要买的子弹数w,确定要卖w粒子弹是否要拆开,若要,则打印'yes',若不要,则打印装有13,11,7粒子弹的盒各要卖多少盒。
(2)找出一个最小的数,凡是来买子弹的数目超过这个数时,肯定不必拆开盒子!
用PASCAL算最好,也可以用数学算法解答(一样+分)!
谢谢了!
回复列表 (共7个回复)
沙发
我是严天雯 [专家分:110] 发布于 2006-12-08 16:44:00
做出了第一道:
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);
板凳
我是严天雯 [专家分:110] 发布于 2006-12-08 16:44:00
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 楼
我是严天雯 [专家分:110] 发布于 2006-12-08 16:45:00
if s=0 then writeln('Yes');
writeln;
end.
4 楼
编程黑客 [专家分:1660] 发布于 2006-12-10 21:56:00
第二个问题是什么意思
能举个例子吗
5 楼
雪光风剑 [专家分:27190] 发布于 2006-12-11 09:53:00
第二题我看明白了
就是找到最小的n使得任意s>=n都能满足
s=7a+11b+13c(*)
我的思路是从14开始repeat往后找
1)对满足条件(*)的第一个数进行定位
2)然后往后进行验证,验证满被定位数后的连续6个数都满足条件(*)就把被定位数打印出来
3)否则继续向后验证至出现下一个可以满足拆分的数,重复1)
6 楼
雪光风剑 [专家分:27190] 发布于 2006-12-11 09:57:00
思路很简单:如果连续6个数都可拆,那么到第7个只要把原数拆法+7就肯定可拆
最后我已经手动计算出结果了。最小的是31(30是最大的不可拆),而56以后都可以通过简单变换加以验证
7 楼
雪光风剑 [专家分:27190] 发布于 2006-12-13 19:23:00
具体实践中可以用递归来验证一个数能否被合理拆分
我来回复