模拟题8

A1098. 加法分解
时间限制:1.0s   内存限制:256.0MB
总提交次数:86   AC次数:30   平均分:44.88
将本题分享到:
      
   
问题描述
  给一个正整数n,输出它所有的正整数加法的分解方法。
  注意:
  1. 根据输入的要求决定交换加数的位置是否视为不同的分解方案。
  2. 不分解也视为一种分解方案。
  3. 按字典序输出所有分解方案,格式见样例。
输入格式
  输入共1行,包含2个正整数n和m,之间用一个空格隔开。n表示待分解正整数,m是1或者2:
  1表示交换加数的位置是否视为不同的分解方案;
  2表示交换加数的位置是否视为相同的分解方案。
输出格式
  输出若干行,每行表示一种分解方案。对于一种方案,先输出n,再输出一个“=”。然后输出分解的各数,不同的数之间用一个“+”连接。
样例输入
5 2
样例输出
5=1+1+1+1+1
5=1+1+1+2
5=1+1+3
5=1+2+2
5=1+4
5=2+3
5=5
输入输出样例2
样例输入
5 1
样例输出
5=1+1+1+1+1
5=1+1+1+2
5=1+1+2+1
5=1+1+3
5=1+2+1+1
5=1+2+2
5=1+3+1
5=1+4
5=2+1+1+1
5=2+1+2
5=2+2+1
5=2+3
5=3+1+1
5=3+2
5=4+1
5=5
数据规模和约定
  对于50%的数据有M=1,另有50%的数据有M=2。对100%的数据,n≤15。
 
朴素dfs,新学习了怎么处理不重复问题就用上了。
注意输出时小小的处理(b数组)
View Code
 1 program sky;
 2 var
 3   n,m,j:longint;
 4   s:string;
 5   b:array['0'..'@'] of longint;
 6   ch:char;
 7 procedure dfs(x:longint);
 8 var
 9   i:longint;
10 begin
11   for i:=1 to n do
12     if x+i<n then
13     begin
14       s:=s+chr(i+48)+'+';
15       dfs(x+i);
16       delete(s,length(s)-1,2);
17     end else
18     if x+i=n then
19     begin
20       write(n,'=');
21       for j:=1 to length(s) do
22         if s[j]='+' then write('+') else write(b[s[j]]);
23       writeln(i);
24     end;
25 end;
26 procedure dfss(x,next:longint);
27 var
28   i:longint;
29 begin
30   for i:=next to n do
31     if x+i<n then
32     begin
33       s:=s+chr(i+48)+'+';
34       dfss(x+i,i);
35       delete(s,length(s)-1,2);
36     end else
37     if x+i=n then
38     begin
39       write(n,'=');
40       for j:=1 to length(s) do
41         if s[j]='+' then write('+') else write(b[s[j]]);
42       writeln(i);
43     end;
44 end;
45 begin
46   readln(n,m);
47   b['0']:=0;
48   for ch:='1' to '@' do b[ch]:=b[pred(ch)]+1;
49   if m=1 then dfs(0)
50   else dfss(0,1);
51 end.

skysun原创。

posted @ 2012-04-27 16:15  SunSky...  阅读(310)  评论(0编辑  收藏  举报