整数的拆分
整数拆分分为有序拆分和无序拆分;
有序拆分: 把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; }