整数划分
2015-08-01 16:18
357 查看
整数划分,是指把一个正整数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;
}
题外话:今天依旧是在看了别人的分析的基础上才写出的代码,,真要自己做还是没有什么思路,整个思维方式跟不上,其实这道题很简单。
分析:
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;
}
题外话:今天依旧是在看了别人的分析的基础上才写出的代码,,真要自己做还是没有什么思路,整个思维方式跟不上,其实这道题很简单。
相关文章推荐
- Jsoncpp使用详解以及链接问题解决
- C语言编程入门——数组(下)
- 常见API对象
- Android系统自带样式(@android:style/)
- 【Lua】pairs 和 ipairs
- HDU 5328(2015多校4)-Problem Killer(水题)
- 希尔算法 经典解法
- Codeforces 435B
- 在CentOS上搭建LAMP+vsftpd环境的简单指南
- android学习路线图
- activity_main cannot be resolved or is not a field
- 两数组中项问题
- Web项目练习总结(错误校正篇)
- Freescale 之Flexbus总线读写SRAM
- CFile、CStdioFile、FILE和其他文件操作(转+总结)
- [转] HashMap
- 第四天----数组和String
- Hduoj1036【水题】
- 【练习题】28.字符串转换
- WCF 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。