华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2993|回复: 10
打印 上一主题 下一主题

P2404 自然数的拆分问题

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-5-12 23:15:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P2404

题目背景
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。

题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。

输入输出格式
输入格式:
输入:待拆分的自然数n。

输出格式:
输出:若干数的加法式子。

输入输出样例
输入样例#1:
7
输出样例#1:
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4
说明
用回溯做。。。。

n≤8
回复

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
11#
发表于 2018-9-2 12:13:20 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n,a[99]={1};
  4. void print(int t)
  5. {
  6.     if(a[t]==n)return ;
  7.     for(int i=1; i<=t-1; i++)
  8.         cout<<a[i]<<'+';
  9.     cout<<a[t]<<endl;
  10. }
  11. void chai(int s,int t)
  12. {
  13.     for(int i=a[t-1];i<=s;i++)
  14.     {
  15.         s-=i;
  16.         a[t]=i;
  17.         if(s==0)print(t);
  18.         else chai(s,t+1);
  19.         s+=i;
  20.     }
  21. }
  22. int main()
  23. {
  24.     cin>>n;
  25.     chai(n,1);
  26.     return 0;
  27. }
复制代码
回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
10#
发表于 2018-9-1 21:09:56 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int s[9];
  4. int n,c,t;
  5. void dfs(int x)
  6. {
  7.     for(int i=s[x-1];i<n;i++)
  8.         if(c+i<=n)
  9.         {
  10.             c+=i;s[x]=i;
  11.             if(c==n)
  12.             {
  13.                 cout<<s[1];
  14.                 for(int j=2;j<=x;j++)
  15.                     cout<<"+"<<s[j];
  16.                 cout<<endl;
  17.             }
  18.             else dfs(x+1);
  19.             c-=i;
  20.         }
  21.         else return;
  22. }
  23. int main()
  24. {
  25.     cin>>n;s[0]=1;
  26.     dfs(1);return 0;
  27. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
9#
发表于 2018-7-12 16:39:38 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n,a[10001]={1},t=1;
  4. void dfs(int x,int y)
  5. {
  6.     int i,k;
  7.     if(y==0)
  8.     {
  9.         for(k=1; k<x-1; k++)
  10.             cout<<a[k]<<"+";
  11.         cout<<a[x-1]<<endl;
  12.         return;
  13.     }
  14.     else
  15.         for(i=a[x-1]; i<=y; i++)
  16.         {
  17.             if(i<n)
  18.             {
  19.                 a[x]=i;y-=i;
  20.                 dfs(x+1,y);
  21.                 y+=i;
  22.             }
  23.         }

  24. }
  25. int main()
  26. {
  27.     cin>>n;
  28.     dfs(1,n);
  29.     return 0;
  30. }
复制代码
回复 支持 反对

使用道具 举报

0

主题

5

帖子

43

积分

新手上路

Rank: 1

积分
43
8#
发表于 2018-7-5 09:15:13 | 只看该作者
#include<iostream>
#include<cstdio>
using namespace std;
const int mm=100;
int n;
int a[mm];
void dfs(int f,int m,int l)
{
    if(l==0&&f!=2)
    {
        //cout<<f<<"====";
        for(int i=1;i<=f-2;i++)
        {
            cout<<a[i]<<'+';
        }
        cout<<a[f-1];
        cout<<endl;
    }
    else if(l<m)return;
    else
    {
        for(int i=m;i<=l;i++)
        {
            a[f]=i;
            dfs(f+1,i,l-i);
        }
    }
}
int main()
{
    cin>>n;
    dfs(1,1,n);
    return 0;
}
回复 支持 反对

使用道具 举报

0

主题

17

帖子

82

积分

注册会员

Rank: 2

积分
82
7#
发表于 2018-6-28 20:17:16 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int a[9];
  4. int n;
  5. void hhh(int i,int s)
  6. {
  7.     int j,k;
  8.     if(s>=n)
  9.     {
  10.         for(j=1;j<=i-1;j++)
  11.             if(j==1)
  12.                 cout<<a[j];
  13.             else
  14.                 cout<<"+"<<a[j];
  15.         cout<<endl;
  16.     }
  17.     else for(k=1;k<=n-s;k++)
  18.     {
  19.         if(k>=a[i-1]&&k!=n)
  20.         {
  21.             a[i]=k;
  22.             hhh(i+1,s+a[i]);
  23.         }
  24.     }
  25. }
  26. int main()
  27. {
  28.     cin>>n;
  29.     hhh(1,0);
  30.     return 0;
  31. }
复制代码
回复 支持 反对

使用道具 举报

0

主题

4

帖子

38

积分

新手上路

Rank: 1

积分
38
6#
发表于 2018-6-26 20:45:26 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n, a[10001], total;
  4. void print() {
  5.     int count = 1;
  6.     while (a[count]) {
  7.         if (!a[count + 1]) cout << a[count];
  8.         else cout << a[count] << "+";
  9.         count++;
  10.     }
  11.     cout << endl;
  12.     return ;
  13. }
  14. void search(int x) {
  15.     int i;
  16.     if (total == n) {
  17.         print();
  18.         return ;
  19.     }
  20.     for (i = 1; i < n; i++) {
  21.         if (i >= a[x - 1]) {
  22.             a[x] = i;
  23.             total += a[x];
  24.             if (total > n) {
  25.                total -= a[x];
  26.                a[x] = 0;
  27.                break;
  28.             }
  29.             search(x + 1);
  30.             total -= a[x];
  31.             a[x] = 0;   
  32.         }
  33.     }
  34. }
  35. int main() {
  36.     cin >> n;
  37.     search(1);
  38.     return 0;
  39. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
5#
发表于 2018-6-25 21:26:08 | 只看该作者
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <map>
  6. #include <string>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <cstdio>
  11. #include <cstdlib>
  12. using namespace std;
  13. int n,a[20];
  14. void dfs(int left,int last,int w)
  15. {
  16.         if(left==0&&w!=1)
  17.         {
  18.                 for(int i=1;i<w;i++)
  19.                         printf("%d+",a[i]);
  20.                 printf("%d\n",a[w]);
  21.                 return ;
  22.         }
  23.         for(int i=last;i<=left;i++)
  24.                 a[w+1]=i,dfs(left-i,i,w+1);
  25. }
  26. int main()
  27. {
  28.     scanf("%d",&n);
  29.     dfs(n,1,0);
  30.     return 0;
  31. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
地板
 楼主| 发表于 2018-6-4 17:04:07 | 只看该作者
李思旷同学的那个string out真是别出心裁!
回复 支持 反对

使用道具 举报

3

主题

12

帖子

45

积分

华一学生

积分
45
板凳
发表于 2018-6-4 13:52:21 | 只看该作者
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int n;
  5. void dfs(int last,int now,int tot,string out)
  6. {
  7.     if(now==tot)
  8.     {
  9.         cout<<out<<endl;
  10.         return ;
  11.     }
  12.     for(int i=last;i<=tot-now;i++)
  13.     {
  14.         string str=out;
  15.         str+='+';
  16.         str+=i+'0';
  17.         dfs(i,now+i,tot,str);
  18.     }
  19. }
  20. int main()
  21. {
  22.     cin>>n;
  23.     for(int i=1;i<=n/2;i++)
  24.     {
  25.         string str="";
  26.         str+=i+'0';
  27.         dfs(i,i,n,str);
  28.     }
  29.     return 0;
  30. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 02:30 , Processed in 0.173110 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表