整数划分问题

  • Post author:
  • Post category:其他


将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。

正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。

例如:正整数6有如下11种不同的划分:

6;

5+1;

4+2,4+1+1;

3+3,3+2+1,3+1+1+1;

2+2+2,2+2+1+1,2+1+1+1+1;

1+1+1+1+1+1。

在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系。

在这里插入图片描述

#include<iostream>
using namespace std;

int q(int n, int m){
	
	if(n < 1 || m < 1){
		return 0; 
	}if(n == 1 || m == 1){
		return 1;
	}if(n < m){
		return q(n,n);
	}if(n == m){
		return 1 + q(n, m-1);
	}else{
		return q(n, m-1)+q(n-m, m);	
	}
	
}

int main(){
	
	int x = q(6,6);
	cout << x << endl;
}

在这里插入图片描述

关键要理解n>m的情况。逐步减少,递归到其他情形中去



版权声明:本文为weixin_44469806原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。