放苹果 (穷竭搜索)

题目:
把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心态崩了呀~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值