整数划分
来源:互联网 发布:免费网络服务器 编辑:程序博客网 时间:2024/05/22 07:57
整数划分,是指把一个正整数n写成如下形式:n=m1+m2+......mn,若其中最大的数max(m1,m2,m3.....)<m,则成为n的一个m划分,记为f(n,m);eg:4的一个划分为{4},{1,3},{2,2}({1,3}与{3,1}视为同一个划分,即划分是无序的)
分析:
1》若n=1,不论m何值,只有一种划分{1};
2》若m=1,不论n何值,只有一种划分{1,1,1,1,1......};
3》若n<m,因为没有负数的存在,所以f(n,m)=f(n,n);
4》若n=m,则可分两种情况讨论:
a》划分中包含m(=n),所以只有一种划分即{n};
b》划分中不包含m,即最大只能是m-1,即为f(n,m-1);
5》若n>m,也分两种情况讨论
a》划分中包含了m,则为{m,{m1,m2,m3......}},即f(n-m,m);
b》划分中不好m,则为f(n,m-1);
综上:
f(n,m)=1,n=1orm=1
f(n,m)=f(n,n)n<m
f(n,m)=1+f(n,m-1)n=m
f(n,m)=f(n-m,m)+f(n,m-1)n>m
#include<iostream>using namespace std;int f(int n,int m){if(n==1 ||m==1)return 1;else if(n<m)return f(n,n);else if(n==m)return (1+f(n,m-1));else {return (f(n-m,m)+f(n,m-1));}}int main(){int n,m;scanf("%d %d",&n,&m);printf("result=%d\n",f(n,m));return 0;}
题外话:今天依旧是在看了别人的分析的基础上才写出的代码,,真要自己做还是没有什么思路,整个思维方式跟不上,其实这道题很简单。
0 0
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分
- 整数划分:
- 整数划分
- 整数划分
- 整数划分
- 树链剖分
- ssh三大框架:SSH三大框架的作用
- OC_Block
- YUV播放器
- apt-get命令详解
- 整数划分
- 编程之美:第三章 结构之法 3.1字符串移位包含的问题
- ArrayList练习 将学生对象添加到集合中,并遍历输出
- uva 10763 Foreign Exchange 交换生
- Xcode中如何关闭ARC
- JVM内存模型及内存分配过程
- 插入排序
- uva 11817(球面距离)
- 编程之美: 第三章 结构之法 3.2电话号码对应英语单词