006:简单的整数划分问题
描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。
输入标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。输出对于每组测试数据,输出N的划分数。样例输入
5
样例输出
7
提示5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
WA:
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #include<cstring> #define DEBUG(x) cout << #x << " = " << x << endl using namespace std; int countNum(int n) { if(n==1)return 1; if(n==2)return 1; int l=n/2; int result=0; for(int i=n-1;i>=l;i--){ result+=countNum(i); } return result; } int main() { freopen("in.txt","r",stdin); int n; while(cin>>n){ cout<<countNum(n)<<"\n"; } return 0; }
AC:
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #include<cstring> #define DEBUG(x) cout << #x << " = " << x << endl using namespace std; ///其实问题的本质是n个苹果放到m个篮子中有多少种方法 int countNum(int n,int m) { if(n==0)return 1; if(m==0)return 0; if(n>=m){ return countNum(n,m-1)+countNum(n-m,m); } return countNum(n,m-1); } int main() { // freopen("in.txt","r",stdin); int n; while(cin>>n){ cout<<countNum(n,n)<<endl; } return 0; }
其实问题的本质是n个苹果放到m个篮子中有多少种方法。这是递归的第三种用法,但我总是不得要领,无法准确的抓住子问题