数的拆分 有一步判重特别重要!

突然想起要打上题目

【题目】

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
n=714种拆分方法:
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
total=14

【代码】

#include<iostream>
#include<cstdio>
using namespace std;

int n,h;
int a[100]= {1}; //开始必须为1;
int search(int,int);
int print(int);

int main() {
    cin>>n;
    search(n,1);
    cout<<"total="<<h<<endl;
    return 0;
}

int search(int s,int t) {
    for(int i=a[t-1]; i<=s; i++) //此步为判重 比前一个数大,比总数小,避免重复.
        if(i<n) { //防止7=7的现象产生!!这点非常重要
            a[t]=i;
            s-=i;
            if(s==0) print(t); //当需要拆分的数是0的时候结束
            else search(s,t+1); //继续搜索下一个
            s+=i; //回溯
        }
}

int print(int t) {
    cout<<n<<"=";
    for(int i=1; i<=t-1; i++) cout<<a[i]<<"+";
    cout<<a[t]<<endl;
    h++;
}
View Code

 

posted @ 2017-03-24 19:46  夜雨声不烦  阅读(242)  评论(0编辑  收藏  举报