POJ1664 放苹果 递归

题意:

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?

思路:

我用的是很纯朴的递归法。

分别在纸上自己枚举7 3和7 4的各种情况。

就发现其实是有规律的。

你枚举的过程就会发现其实是一棵树,深度为n。

所以可以直接用dfs解。

#include<iostream>
#include<algorithm>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
int n,m;
int dfs(int now,int step,int sum)
{
	if(step==n)
	{
		if(m-sum>=now)
		{
			return 1;
		}
		return 0;
	}
	int i=now;
	int ret=0;
	int s=0;
	while(ret=dfs(i,step+1,sum+i))
	{
		s+=ret;
		i++;
	}
	return s;
}
void solve()
{
	int sum=0;
	if(1==n)
	{
		printf("1\n");
		return;
	}
	for(int i=0;i<=m/n;i++)
	{
		sum+=dfs(i,2,i);
	}
	printf("%d\n",sum);
}
int main()
{
	int cases;
	scanf("%d",&cases);
	while(cases--)
	{
		scanf("%d%d",&m,&n);
		solve();
	}
}


你可能感兴趣的:(POJ1664 放苹果 递归)