将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种划分方案被认为是相同的。
1 1 5
1 5 1
5 1 1
问有多少种不同的分法。
输入描述 Input Description
输入:n,k (6<n<=200,2<=k<=6)
输出描述 Output Description
输出:一个整数,即不同的分法。
样例输入 Sample Input
7 3
样例输出 Sample Output
4
先贴上一发DFS的代码,以后再想想将其当成动态规划再来一遍
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
int sum[201];
int maxx=0;
int m,n;int num[400];
void dfs(int rest,int duan,int pos)
{
int i,x,tmp;
if(duan==0||rest==0)
{
if(rest!=0)return ;
if(duan!=0)return ;
maxx+=1;
return ;
}
for(i=pos;i>=1;i--)
{
tmp=rest-i;
x=i*(duan-1);
if(tmp>x)
continue;
else if(tmp<duan-1)
continue;
num[duan]=i;
dfs(tmp,duan-1,i);
}
}
int main()
{
sum[0]=0;
while(scanf("%d%d",&m,&n)!=EOF)
{
maxx=0;
dfs(m,n,m);
printf("%d\n",maxx);
}
return 0;
}