help!!!!help!!

小圌的全排列

2. 自然数的拆分

题目ID:9396必做题100分

最新提交:

Wrong Answer

0 分

历史最高:

Wrong Answer

0 分

时间限制: 1000ms

空间限制: 524288kB

题目描述

时间限制:1s 空间限制:512M

题目描述:

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。当n=7时,共14种拆分方法:

7=1+1+1+1+1+1+1 7=1+1+1+1+1+2 7=1+1+1+1+3 7=1+1+1+2+2 7=1+1+1+4 7=1+1+2+3 7=1+1+5 7=1+2+2+2 7=1+2+4 7=1+3+3 7=1+6 7=2+2+3 7=2+5 7=3+4

输入格式:

一个整数 �n。(2≤�≤25)(2≤n≤25)

输出格式:

按字典序输出具体的方案。

样例输入:

5

样例输出:

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

#include<bits/stdc++.h>
using namespace std;
int n,m,sum=0,ans=0,sm;
int visit[101],a[101],u[101];
void dfs(int cur,int s){
  int i;
  if(s==n){
    if(cur==2){
      return;
    }
    for(int i=1;i<cur;i++){
      if(i==1){
        cout<<a[i];
      }else{
        cout<<'+'<<a[i];
      }
    }
    cout<<'\n';
    return ;
  }
  for(i=a[cur-1];i<=n-s;i++){
    a[cur]=i;
    dfs(cur+1,s+i);
  }
}
int main(){
  cin>>n;
  a[0]=1;
  dfs(1,0);
  
}

1 个赞

你这个搜索不标准
我给你个伪代码,用深搜写

#include<bits/stdc++.h>
#define int long long
int n,a[114],vis[514];//好臭的定义
void dfs(int x){//深搜
    if(){//判断是否被标记
    	for(int i=1;i<=n;i++){
        	std::cout<<a[i]<<" ";
        }
    	std::cout<<std::endl;
   	 	return;
	}
    for(int i=1;i<=n;i++){
        if(vis[i]==0){
            ____;
            vis[i]=__;
            dfs();
            ______//回溯
        }
    }
}

signed main(){
    std::cin>>n;//输入
    dfs(1);
    return 0;
}

AC了给解决方案

2 个赞

6的勒hh

1 个赞

???

1 个赞