您的位置:首页 > 其它

整数划分

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;
}

题外话:今天依旧是在看了别人的分析的基础上才写出的代码,,真要自己做还是没有什么思路,整个思维方式跟不上,其实这道题很简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: