A1098. 加法分解
时间限制:1.0s 内存限制:256.0MB
总提交次数:86 AC次数:30 平均分:44.88
问题描述
给一个正整数n,输出它所有的正整数加法的分解方法。
注意:
1. 根据输入的要求决定交换加数的位置是否视为不同的分解方案。
2. 不分解也视为一种分解方案。
3. 按字典序输出所有分解方案,格式见样例。
注意:
1. 根据输入的要求决定交换加数的位置是否视为不同的分解方案。
2. 不分解也视为一种分解方案。
3. 按字典序输出所有分解方案,格式见样例。
输入格式
输入共1行,包含2个正整数n和m,之间用一个空格隔开。n表示待分解正整数,m是1或者2:
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
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
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原创。