openjudge_2.5基本算法之搜索_666:放苹果

苹果分盘问题解析

题目

666:放苹果
总时间限制: 1000ms 内存限制: 65536kB
描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
样例输出
8

理解

如果i个苹果不一样,j个盘子一样,就用插空法解决。
i个苹果中间有i+1个空隙,这些空隙里挑j个,组合问题c(i+1,j)。
现在苹果一样,盘子一样,也是组合问题,
分类成两种情况,盘子全满了和有空盘子两种,分类就是加法。
f[i][j]=f[i][j-1]+f[i-j][j]
f[7][3]=f[7][2]+f[4][3]
7个苹果分3个盘子
7 0 0
6 1 0
5 2 0
5 1 1
4 3 0
4 2 1
3 3 1
转换成较小的两种状态,所有盘都有和个别盘空
7 0 0
6 1 0
5 2 0
4 3 0
5 1 1
4 2 1
3 3 1
个别盘空,就是问题转换成7个苹果2个盘
7 0 0
6 1 0
5 2 0
4 3 0
所有盘都满
5 1 1
4 2 1
3 3 1
每个盘都减去要给苹果,组合数不变
4 0 0
3 1 0
2 2 0
刚好就是7-3=4个苹果2个盘的状态
如果苹果比盘子少,多的盘子没用
f[i][j]=f[i][j-1]
总之就是用分类原理,把大规模问题转换成相对小规模问题,直到最初有答案的问题。递归也可以,动规也可以

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值