问题 J: 【搜索】自然数的拆分问题

时间限制: 1 Sec 内存限制: 64 MB

题目描述
输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。

输入
一个整数n,指待拆分的自然数n(l≤n≤30)。

输出
若干行,每一行是一个数的加法式子。

样例输入

4

样例输出

1+3
1+1+2
1+1+1+1
2+2

心路历程
这道题,我,一言难尽啊。我的dfs修改到了3.0版本,可还是wa,打印顺序总是有出入。终于,天无绝人之路。
在这里插入图片描述
解题思路:根据样例来看,打印顺序并不是常见的“字典序”,而是“不完全归纳”的一种顺序。
根据不完全归纳,以6为例:
6 = 1 + 5 = 1 + 1 + 4 = 1 + 1 + 1 + 3 = 1 + 1 + 1 + 1 + 2 = 1 + 1 + 1 + 1 + + 1 + 1 = 2 + 4 = 2 + 2 + 2 = 3 + 3 6=1+5=1+1+4=1+1+1+3=1+1+1+1+2=1+1+1+1++1+1=2+4=2+2+2=3+3 6=1+5=1+1+4=1+1+1+3=1+1+1+1+2=1+1+1+1++1+1=2+4=2+2+2=3+3
也就是按照 a [ 1 ] a[1] a[1]进行分类,一共有 1 , 2.... n / 2 1,2....n/2 1,2....n/2.

开始对a数组处理,要给 a [ 1 ] , a [ 2 ] a[1],a[2] a[1],a[2]附初始值。
其实就是拆分 f ( n ) f(n) f(n), f ( n ) = 1 + f ( n − 1 ) f(n)=1+f(n-1) f(n)=1+f(n1),再将 f ( n − 1 ) f(n-1) f(n1)拆分;一个递归结束之后,再进行 f ( n ) = 2 + f ( n − 2 ) f(n)=2+f(n-2) f(n)=2+f(n2)……很显然的一个递归过程。

#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include <cstdio>
//#define local
using namespace std;

typedef unsigned long long ull;
typedef long long ll;

const int N = 1e5+5;
const int inf = 0x3f3f3f3f;
const int mod = 998244353 ;
int n;
int a[100];
void digui(int t){
  for(int i=1;i<t;i++)
     printf("%d+",a[i]);
  printf("%d\n",a[t]);
  int cur=a[t];
  for(int i=a[t-1];i<=cur/2;i++){
    a[t]=i;
    a[t+1]=cur-i;
    digui(t+1);
  }
}
int main()
{
#ifdef local
   freopen("input.txt","r",stdin);
#endif
     scanf("%d",&n);
     for(int i=1;i<=n/2;i++){
       a[1]=i;
       a[2]=n-i;
       digui(2);
     }
     return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值