N的M划分!《挑战程序设计竞赛》进来看包懂,因为是我自己理解出来的。

n个无区别的物品,将它们划分为不超过m组,求出划分方法数模M的余数。

题目我就不废话了,照着书看。问题在于 {ai} 怎么理解。{ai}书上说是表示结果的集合,他是一个数(result)

好的进入正题。。。。

    对于{ai} 可以这样理解,假如你有m个袋子,每个袋子放若干个球。当然了球的个数肯定不为负数 ,也就是>=0。

现在根据题目来还原,m个袋子代表m个划分,有的袋子为0个球 表示 划分数少于m。很显然,如果m个袋子里面所有的球数,加在一起=n,那我们的问题就解决了。不过是m个袋子里球的数目正好加一起为n,允许某个袋子为空(划分数少于m,不为空划分数等于m)。

   看到这里大家是不是恍然大悟呢。现在讲一下两种状态方程。首先袋子里面的球 >=0,所以分两种,这两种划分都得考虑,才算完整。

 

dp[m][n],m表示划分数(几个袋子) ,n表示总数(一共有几个球)

1、至少有一个等于0,这个很好理解说明少划分一组,也可以满足总数为n,就是 dp[m][n]=dp[m−1][n]

2、每个都大于等于0,如果还是维持原来的划分数不变化,那我如果每个袋子都拿一个球。,那么我的总的球数 ,就是 n-m。因为我是划分数没变前提,所以这样的话n-m的划分数就和n是一样啦。这样从前往后讲大家是不是很容易理解呢。dp[m][n]=dp[m][n−m]。

总结:

看到这里,应该能明白吧。这里有几点思考,为啥是m-n 而不是m-2n。这里我想说,其实没有区别,就是袋子里可能为1个球啊,你这样你拿两个,不就为负了。拿不了。。。第二点思考就是,为啥我还不下班。。。程序员那么苦逼么??

我在补充一点,刚想下班,又思考了一点。书上算法理解了,但是为啥这种方法可以去除重复???期望有大神评论给我解惑一下。。。

你可能感兴趣的:(N的M划分!《挑战程序设计竞赛》进来看包懂,因为是我自己理解出来的。)