整数划分问题
2011-05-20 16:23
274 查看
给定一个自然数,分成k部分,A1,A2..的数的和,要求A1<=A2...求有多少种?
原理:整数n拆分成最多不超过m个数的和的拆分数,和n 拆分成最大不超过m的拆分数相等。
根据这个原理,原问题就转化成了求最大拆分为k的拆分个数与最大拆分为k-1的拆分个数的差
f(n,k)=f(n,k-1)+f(n-k,k)
代码如下
同时附上ferrer图的几个原理:
a,整数n拆分成k个数的和的拆分数,和数n拆分最大数位k的拆分数相等
b,整数n拆分成最多不超过m个数的和的拆分数,和n拆分成最大不超过m的拆分数相等。
c,整数n拆分成互不相同的若干奇数的和的的拆分数,和n拆分成自共轭的Ferrers图像的拆分数相等.
【博客整理】
原理:整数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图像的拆分数相等.
【博客整理】
相关文章推荐
- C#版本整数划分问题
- 全排列 整数划分问题
- NYOJ 651 Cut the rope(DP, 经典的整数划分问题)
- 整数划分问题
- 整数划分问题【转】
- 整数划分问题之寻找 一组不大于M的互异的整数集,使之和等于N。找出可能的整数集的个数。
- 回溯法解答整数划分问题(Java版本)
- 算法笔记——【递归】整数划分问题
- openjudge 简单的整数划分问题
- 整数划分问题并显示每一种划分形式
- 整数划分问题(一)
- 整数划分问题
- 整数划分问题
- 递归 放苹果问题和整数划分问题
- 整数划分问题
- 整数划分问题
- 整数划分问题(Java版)
- 整数划分问题——动态规划
- 递归-整数划分问题
- OpenJudge 简单的整数划分问题(递归)