写在前面:
是有很久没碰博客了,实在是没时间,今天因为C组有一题不想改了才能抽出时间来写写。
尽量多写写,多写写有用的东西。
Description:有n个物品,每个物品有一个对应的种类,要求你求出要选m个物品的不同方案数。
一开始看,很容易想到用组合数去做,但因为一个物品可能有多个,所以方案可能重复。
那么如何去重?
很容易想到DP.
对于DP,可设f[i,j]表示前i种物品选了j个物品的方案数.
为了去重,如下图:
那么,
对于这里Num[i]的每一个位置,都可以更新方案.
意思就是,每次更新时,总是以一个num[i]种类的数去更新方案,或两个num[i]种类的数去更新方案,三个,四个……直到num[i]个.
这样子很明显就可以去重并求出方案了.
注意这里效率为O(n²*max).
很慢.
可以改为滚动数组或求个前缀和优化时间空间。