#数的划分
【题目描述】
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
{1,1,5};{1,5,1};{5,1,1};
问有多少种不同的分法。 输出一个整数,即不同的分法。
【输入】
两个整数n,k(6<n≤200,2≤k≤6),中间用单个空格隔开。
【输出】
一个整数,即不同的分法。
【输入样例】
7 3
【输出样例】
4
【提示】
四种分法为:{1,1,5};{1,2,4};{1,3,3};{2,2,3}。
#题解
起初想用暴搜解决,网上说防止TLE应该采用dfs
数字总合为n,需要分解为k份,当分解到第m份时,它的取值最小等于a[m-1],最大等于n/(k-m+1),这便是m的取值范围。
#include<iostream>
using namespace std;
int a[7],n,k,m,cnt=0;
void dfs(int m){
if(m==k){
if(a[m-1]<=n){
cnt++;
return ;
}
}
for(int i=a[m-1];i<=n/(k-m+1);i++){//第m份的上下界
a[m]=i;
n-=i;//
dfs(m+1);
n+=i;//
}
}
int main(){
cin>>n>>k;
a[0]=1;//
dfs(1);
cout<<cnt;
return 0;
}
#还没有完全弄懂 这个深搜也也太难理解了叭。。。