【放苹果(题解)】

来源:互联网 发布:淘宝200多的智能机 编辑:程序博客网 时间:2024/05/29 07:35

【原题在此】

如果将题目简化,则如下:将一个正整数m化成n个非负整数的和,求出所有的方案。

所以,思考的重点应放在状态转移上。

首先尝试用一维状态定义f[ ]——发现状态难以转移;

然后在原基础上加上一维,即f[ ][ ]——选取一种合适的状态:

f[i][j]表示i个苹果放在j个盘子中的放法数(注意:不是第i个第j个)

为方便理解,接下来是找规律的过程:(例子是:把6个苹果放在3个盘中)


如果我们天真地认为,f[i][j]仅仅由一个状态转移而来,那么:

我们可以快乐地设:f[i][j]=g(f[某][某])  (    g()为某种函数    )

所以我会想:f[i][j]会不会由f[i][j-1]通过g()函数转移过来?

首先我们看一下这个过程的实际含义:

    “要把i个果果放到j个盘子中的放法数”与“把i个果果放入(j-1)个盘子中的放法数”是否有某种转移关系。

乍一看,二者绝对有关系,不过后者不能构成完整的前者:

即f[i][j-1]不可以直接继承(或简单的通过某种运算得到)f[i][j]。

所以我们需要再做改变或补充:

现在我们开心地认为,f[i][j]仅仅由2个状态转移而来,那么:

我们可以兴奋地设:f[i][j]=g1(f[某][某])+g2(f[xxx][xxx])  (     g1()g2()均为某种函数    )

那么通过上面的图片,可以看出这个状态(f[6][3])可以分为这两部分构成:

第三个盘子没有放苹果的放法数——即第三个数是“0”(共计3个)    

第三个盘子放了苹果的放法数——及第三个数不为“0”(共计3个)

说明:f[6][3]它是可以拆成以下两部分的(即由两种状态所转移得到):


所以,张姐,由上图红圈和黄圈所划分的两部分可以得出结论:

f[ i ][ j ] =f[ i ][ j-1]+f[ i-j ][ j ]                                                       


至此,本题核心问题已解决,剩下的问题还有两点:

(1)预处理(2)递归式和递推式的转换

代码可以告诉你一切:


圆满结束。如果您有什么问题或是发现了纰漏,请在评论里表达意愿,我会及时作出调整和补充。

这只是数学排列组合方面的一道开胃菜,征服这个领域的旅途才刚刚开始!Fighting!



1 0
原创粉丝点击