整形规划
来源:互联网 发布:再见中国海 知乎 编辑:程序博客网 时间: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时程序得到结果变慢。
- 整形规划
- 整形单链表
- 整形数据
- 整形数按位逆置
- php整形
- 整形范围
- 整形指针
- Swift整形
- c的整形转换和整形提升
- 规划
- 规划
- 规划
- 规划
- 规划
- 规划
- 规划
- 规划
- 规划
- Http与服务器的交互(主要post和get)
- 黑马程序员 图形用户界面GUI
- 学生成绩统计
- 明朝万达Chinasec(安元)银行业敏感数据防泄密解决方案
- 例说Linq中Take与Skip的使用
- 整形规划
- 黑马程序员 网络编程
- 因子和
- POJ 3468 A Simple Problem with Integers 线段树区间修改
- 黑马程序员 IO/输入输出流
- 旱冰场造价
- 黑马程序员 多线程
- 第二周作业
- mysql中字符集问题