搜索与回溯系列十三 自然数拆分

2020-02-16  本文已影响0人  徐慵仙

题目

任何一个大于1的自然数,总可以拆分成若干个小于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

代码

#include <iostream>
using namespace std;
int a[1001];
int total=0;
int n;
void print(int k){
    total++;
    cout<<n<<"=";
    for(int i=1;i<k;i++){
        cout<<a[i]<<'+';
    }
    cout<<a[k]<<endl;
}
void search(int k,int s){
    for(int i=a[k-1];i<=s;i++){
        if(i<n){
            a[k]=i;
            s-=a[k];
            if(s==0) print(k);
            else search(k+1,s);
            s+=a[k];
        }
    }
}
int main(){
    cin>>n;
    a[0]=1;
    search(1,n);
    cout<<total;
}

分析

基础套模版题

1 for循环范围

2 判断可选

 if(i<n)

3 选中后

        if(i<n){
            a[k]=i;
            s-=a[k];
        }

4 结束条件

        if(i<n){
            a[k]=i;
            s-=a[k];
            if(s==0) print(k);
            else search(k+1,s);
        }

5 需要回溯

s+=a[k];
上一篇 下一篇

猜你喜欢

热点阅读