整形规划

来源:互联网 发布:再见中国海 知乎 编辑:程序博客网 时间:2024/04/27 22:48

整形规划问题是算法设计的入门问题,但是对于初学者来说比较难懂。今天刚刚弄懂,写出来希望对大家有帮助。

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

即 n = n1 + n2 + n3+ ... nk; nk<=n,不能重复。

下面介绍一下6的整形规划。

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

q(6) = 11;

1  的整形规划

 1

由上可以看出n的整形规划的个数由两个数控制。最大加数m的值决定 横行的次数为(n - m)

n 决定列的个数。

故 设函数int_divide(int n,int m)

由上面的推导我们可以发现以下结论

当m == 1 就是上式1 + 1 + 1 + 1 + 1 + 1 只有一种情况。

当n == 1 时 只有 1;

当n < m 时 由于默认的是 m<=n 故直接另m == n;

当n > m 时  分为两个情况 一是 当 最大整数是m 时 ,就是横着那一行它的个数由(n - m)决定,就是对n - m进行最大数小于等于m的整数规划。int_divide(n-m,m)

而是当最大整数小于m时,就是m行下面的所有,它们表示对n进行最大整数为n - 1的整数规划。int _divide(n,m)

所以代码如下

#include<stdio.h>
int int_divide(int n,int m);
int main()
{
int n = 0;
int m = 0;
printf("please input number.\n");
scanf("%d",&n);
m = int_divide(n,n);
printf("%d\n",m);

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

但是到n = 100时程序得到结果变慢。

0 0
原创粉丝点击