[学习笔记]整数划分问题

整数划分问题

将正整数n表示成一系列正整数之和,

n=n1+n2+n3+...+n(其中,n1≥n2≥...≥nk≥1,k≥1)

正整数n的这种表示称为正整数n的划分。正整数n的不同的划分个数称为正整数n的划分数,记作P(n)。

例如,正整数6有如下11种不同的划分,所以P(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;

在正整数n的所有不同的划分中,将最大加数Nmax不大于m的划分个数记作Q(n,m)。

  1. 首先我们能知道Q(n,1)=1,n≥1,就是Nmax不大于1的时候,如Q(6,1)即为1+1+1+1+1+1这一种,所以Q(n,1)=1;
  2. 当m大于n时,Q(n,m)=Q(n,n),因为最大加数Nmax不能大于n,所以有Q(1,m)=1,如Q(6,8)=Q(6,6);
  3. Q(n,n)=1+Q(n,n-1),如Q(6,6)=1+Q(6,5)(其实6本身算不算做一种划分我不太确定……因为定义此问题的时候描述的是将正整数n表示成一系列正整数之和,而6本身并没有和其他正整数相加……但是书上是这么写的= =);
  4. Q(n,m)=Q(n,m-1)+Q(n-m,m),n>m>1;
 1 //
 2 //  main.c
 3 //  整数划分
 4 //
 5 //  Created by AslieLeo on 13-4-14.
 6 //  Copyright (c) 2013年 AslieLeo. All rights reserved.
 7 //
 8 
 9 #include <stdio.h>
10 
11 int IntegerDivide(int n,int m){
12     if((n<1)||(m<1)) {
13         return 0;
14     }
15     if ((n==1)||(m==1)) {
16         return 1;
17     }
18     if (n<m) {
19         return IntegerDivide(n, n);
20     }
21     if (n==m) {
22         return IntegerDivide(n, m-1)+1;
23     }
24     return IntegerDivide(n, m-1)+IntegerDivide(n-m, m);
25 }
26 
27 int main(int argc, const char * argv[])
28 {
29     int n,m,k;
30     scanf("%d %d",&n,&m);
31     k=IntegerDivide(n, m);
32     printf("%d",k);
33 }

 

posted on 2013-04-14 21:07  dystopia_P  阅读(369)  评论(0编辑  收藏  举报

导航