数的划分(。。)

题目传送门sxazr
本题应该想到分解的数递增,这样可避免重复,即 a[i]>a[i-1];
a[i]的上界,m=n-(a[1]+a[2]+…+a[i-1])平均分成k-(i-1)份,即 a[i]<=m/(k-i+1);
代码

#include <iostream>
#include <cstdio>
using namespace std;
int n,k,ans,d,a[210];
void dfs(int x)  //x为第几份
{
	if(n==0) return;
	if(x==k){
		if(n>=a[x-1]) ans++;
		return;
	}
	for(int i=a[x-1];i<=n/(k-x+1);i++){
		a[x]=i;
		n-=i;
		dfs(x+1);
		n+=i;
	}
}
int main()
{
	cin>>n>>k;
	a[0]=1;
	dfs(1);
	cout<<ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42920137/article/details/88376354