本质即深搜找所有符合条件的路径
1.条件,将n分解为至少两个数相加,条件为前面的 数小于后面的数
2.用数组记录先后出现的数,只要满足后一个大于等于前一个就满足,一条路径结束的标志为要分解的数为0,所以每次传入 要分解的数,和前一个数下标
3,每次加回那个数使得回溯再找,每次也已从前面的数到sum分解(注意分解出的数要小于总的n防止只有一个)
#include<bits/stdc++.h> using namespace std; int a[10]={1},n; void print1(int t) { for(int i=1;i<t;++i) { cout<<a[i]<<"+"; } cout<<a[t]<<endl; } void search(int t,int sum) { for(int i=a[t-1];i<=sum;++i ) { if(i<n) { sum-=i; a[t]=i; if(sum==0) { print1(t); } else { search(t+1,sum); sum+=i;//按位来搜索,用数组记录前一位,每次传入前一位位置和需要分解总量 // 当要分解和为0,就输出,不然继续按大于前一位分解(从小到大字典序) //将第0位初始化为1,使边界符合算法过程(优先考虑中间)再统一或特殊化处理边界 } } } } int main () { cin>>n; search(1,n); return 0; }
自然数字典序分解)
最新推荐文章于 2024-05-29 14:10:32 发布