98 数的划分
作者: Turbo时间限制: 1S章节: 动态规划
问题描述 :
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
样例输入
7 3
样例输出
4 {四种分法为:1,1,5; 1,2,4; 1,3,3; 2,2,3;}
输入说明 :
两个整数n和k
6<n<=200,2<=k<=6
输出说明 :
一个整数,即不同的分法
输入范例 :
7 3
输出范例 :
4
/**
数的划分:
1.这些情况必可分为如下两种情况
1.1 有1的情况下 dg(n-1,k-1)
1.2 无1的情况下 dg(n-k,k) (可以将k块全部减去1 ) 这样必然无1
1.3递归终止条件 (n==0||n<k||k==0) n<k不可再分
*/
#include<iostream>
using namespace std;
int dg(int n,int k) //把n整数划分成k份
{
if(n==0||n<k||k==0)return 0; //无法继续划分
if(k==1||n==k)return 1; //只能划分成一项
return dg(n-1,k-1)+dg(n-k,k);
}
int main()
{
int n,k; //把n整数划分成k份
cin>>n>>k;
int x=dg(n,k);
cout<<x<<endl;
return 0;
}
小结:这里的代码借鉴一位博主的思路,相比于动态规划,我更喜欢递归