把N个鸡蛋放到M个篮子里,每个篮子不能为空,要求满足:任意给出一个不超过N的数量,都能找到其中某几个篮子的鸡蛋和等于它。
请写一个程序,输入N,M,然后输出所有的鸡蛋放法。
那么1,X2中,X2可以放鸡蛋的范围是1<= X2<=2, 如果X2=3,便满足不了给出n=2的情况了
取X2=2
请写一个程序,输入N,M,然后输出所有的鸡蛋放法。
题目解释:例如6个鸡蛋放3个篮子的一种可能为1,2,3,任意给出1<=x<=6的值,都可以找到1,2,3中的组合的和等于x.
看到题目 就要着手找思路
6,3 =1,2,3 所有放法
方法一 蛮力+剪切
第一个 A(3)(6)/A(3)(3) 组合数
组合数的求法
从小往大求 剪枝
for(1-6 i)
//满足 i== 6时成立
for(1-6 j)
//保证后面不大于前面则可 i>j break; //当且仅当 满足 i+j== 6时成立
for(1-6 k) //k>i||k>j break;
//当且仅当 满足 i+j+k == 6时成立
方法二
研究特例 (转)
假设第一个篮子放一个鸡蛋:
那么1,X2中,X2可以放鸡蛋的范围是1<= X2<=2, 如果X2=3,便满足不了给出n=2的情况了
取X2=2
那么1,2,X3中,X3可以放鸡蛋的范围是2<= X3<=4
…..
可以推出数学公式:在前m个篮子满足要求时,第m+1个篮子可以放置的鸡蛋数范围应该是: Xm<=Xm+1<=N+1
该范围同时也是搜索解的空间,比较好用递归实现,对于每找到一个符合范围的Xm,可以进一步深度遍历寻找下一个Xm+1, 由此便容易理解标准答案的实现了。
递归 f(n-1)<f(n)<n+1
{
i = f(n-1)
for(i~n+1)
i++
//符合范围
f(n+1)
}