放苹果 (穷竭搜索)

题目:
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

解题思路:
1.刚开始,我以为这是一道简单的排列组合问题,后来我发现事情并不简单
链接
2.网上的题解基本都是动态规划,我也没太搞懂为什么每个盘子拿掉一个苹果结果会不变
递推公式:f[m][n] = f[m][n - 1] + f[m - n][n]
3.我自己又想了一种笨方法:
把n个盘子当成n层递归,每一层选一定数量的苹果
选的过程中有两个限制就是,①当前层选取的苹果不能超过上一层的苹果,比如当上一层选了3,下一层就不能选4
②满足了递减的规则后还有一个规则就是,当前层如果选了一个很小的数量,后面即使全部选这个数量(因为后面不能再超过这个数字了)也不能用完还没有用的苹果

代码如下:

#include<iostream>
using namespace std;
int ans;
void lol(int last,int sum,int n)				//上一层选的数量,还剩sum个苹果,第t层 
{
	if(n==1&&sum<=last)
	{
		ans++;
		return;
	}
	for(int i=0;i<=sum&&i<=last;i++)			//保证层与层之间递减的顺序 
	{
		if((sum-i)/(n-1)+((sum-i)%(n-1)!=0)<=i) //保证后面层不会超过i,也可写成if(n*i>=sum)
		{
			lol(i,sum-i,n-1);					//当前层选i 
		}
	} 
}
int main()
{
	int t,m,n;
	cin>>t;
	while(t--)
	{
		ans=0;
		cin>>m>>n;
		lol(m,m,n);
		cout<<ans<<endl;
	} 
	return 0;
}
 

我tm心态崩了呀~

发布了2 篇原创文章 · 获赞 2 · 访问量 140

猜你喜欢

转载自blog.csdn.net/qq_45572675/article/details/104159840