整数划分

来源:互联网 发布:免费网络服务器 编辑:程序博客网 时间: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
原创粉丝点击