首页 > 学院 > 开发设计 > 正文

整数划分问题——POJ放苹果问题

2019-11-08 01:58:02
字体:
来源:转载
供稿:网友

放苹果

Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32121 Accepted: 20178 Description

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

Input

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

Output

对输入的每组数据M和N,用一行输出相应的K。

Sample Input

1 7 3 Sample Output

8 Source

lwx@POJ

算法思想

首先要从数学的角度认识,这个问题属于整数的划分问题,即将正整数表示成一系列正整数之和——正整数N的划分。

在正整数N的所有不同的划分中,将最大加数n1不大于m的划分个数记作q(n, m),可以建立如下递归关系。 (1)q(n, 1)=1, n>=1; (2)q(n, m)= q(n, n), m>=n; (3)q(n, n)= 1+q(n, n-1); (4)q(n, m)= q(n, m-1)+q(n-m, m), n>m>1。

#include <iostream>using std::cout;using std::cin;using std::endl;int mathods(int m, int n);int main(void){ int t, M, N; cin>>t; while (t--) { cin>>M>>N; cout<< mathods(M, N); cout<<endl; } return 0;}int mathods(int m, int n){ if((m<1)||(n<1)) return 0; if((m==1)||(n==1)) return 1; if(m<n) return mathods(m, m); if(n==m) return mathods(m, n-1)+1; return mathods(m, n - 1)+ mathods(m - n, n);}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表