整数划分问题

 

 

给定一个自然数,分成k部分,A1,A2..的数的和,要求A1<=A2...求有多少种?

原理:整数n拆分成最多不超过m个数的和的拆分数,和n  拆分成最大不超过m的拆分数相等。
根据这个原理,原问题就转化成了求最大拆分为k的拆分个数与最大拆分为k-1的拆分个数的差
f(n,k)=f(n,k-1)+f(n-k,k)
代码如下
#include "stdafx.h" #ifndef SPLITTOKNUM_H #define SPLITTOKNUM_H #include<iostream> #include <memory.h> #define MaxN 100 class SplitToKNum { public: SplitToKNum() { std::cin>>n; std::cin>>k; memset(f,0,sizeof(f)); for(int i=1;i<=k;i++) { f[MaxN][i]=1; } for(int j=1;j<=k;j++) for(int i=MaxN+1;i<=MaxN+n;i++) f[i][j]=f[i][j-1]+f[i-j][j]; std::cout<<f[n+MaxN][k]-f[n+MaxN][k-1]<<std::endl; } int n; int k; int f[2*MaxN+1][MaxN]; }; #endif 
同时附上ferrer图的几个原理:
a,整数n拆分成k个数的和的拆分数,和数n拆分最大数位k的拆分数相等
b,整数n拆分成最多不超过m个数的和的拆分数,和n拆分成最大不超过m的拆分数相等。
c,整数n拆分成互不相同的若干奇数的和的的拆分数,和n拆分成自共轭的Ferrers图像的拆分数相等.
【博客整理】

 

你可能感兴趣的:(整数划分问题)