zoukankan      html  css  js  c++  java
  • 模拟题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原创。

  • 相关阅读:
    [NOI2004] 郁闷的出纳员
    对象内部套嵌多个对象
    函数
    匿名函数、对象
    函数部分
    Html部分
    搜索二叉树的应用
    二叉树的线索化
    搜索结构搜索二叉树
    堆与最优级队列
  • 原文地址:https://www.cnblogs.com/skysun/p/2473730.html
Copyright © 2011-2022 走看看