我不知道能否会成功,但我仍想试一试,哪怕只有一线希望
洛谷——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\le 8n≤8
dfs
(按照划分的数的个数来划分)
40分代码
搜索,由于1 1 5 跟5 1 1 为一种划分方式,这样相同的划分方式只要后面的数比前面的数小的一定已经被划分过一次了。那么我们进行划分的时候枚举每一个数,枚举的数保证后面的数一定比前面的数大。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,sum,num[50]; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f; } void dfs(int s,int k) { for(int i=num[k-1];i<=n;i++) { if(s>=i) { s=s-i; num[k]=i; if(s==0) { if(k==1) continue; for(int j=1;j<k;j++) printf("%d+",num[j]); printf("%d\n",num[k]); } else dfs(s,k+1); s+=i; } else break; } } int main() { n=read(); for(int i=0;i<=n+1;i++) num[i]=1; dfs(n,1); return 0; }