整数的拆分

整数拆分分为有序拆分和无序拆分;

有序拆分: 把n拆分为 r个数,就相当于把n个球用 r-1块隔板插入到n-1个空隙里  C(r-1,n-1);  放球模型,把n个无区别的球放入到r个有区别的盒子里,每个盒子至少一个。

无序拆分: 把n拆分为 r个数,把n个相同的球放入到r个相同的盒子里,允许盒子为空。

把n个相同的球放入到r个不同的盒子里,允许盒子为空,我们可以用x1+x2+x3+...+xr=n 表示 xi为非负整数  C(k-1+r,r)   去掉盒子编号  C(k-1+r,r)/r!

假设把n拆成  1、2、3、4 的和,输出拆分数

#include<iostream>
using namespace std;
int main(){
    int n;               //要拆分的数
    int c[100],c1[100];
    while(cin>>n){
        if(n<0)  break;
        memset(c,0,sizeof(c));
        memset(c1,0,sizeof(c1));
        for(int i=0;i<=n;i++){     //
            c[i]=1;
        }
        for(int i=2;i<=4;i++){
            for(int j=0;j<=n;j++)
                for(int k=0;k+j<=n&&k<=n;k+=i)
                    c1[k+j]+=c[j];
            for(int j=0;j<=n;j++){
                c[j]=c1[j];
                c1[j]=0;
            }
        }
        cout<<c[n]<<endl;

    }
    return 0;
}
原文地址:https://www.cnblogs.com/wintersong/p/4930700.html