每个桶的容量为a1,a2,a3......am
设dp[i][j]为仅使用第1,2,3...i个桶,放入j个球共有多少种放置方法。
设t=min{j,ai},表示第i个桶里面最多可以放入t个球。
当第i个桶放入0,1,2....t个球时,共有dp[i-1][j],dp[i-1][j-1]....dp[i-1][j-t]种放法。
得到dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+....+dp[i-1][j-t]
运用这种思想写出来的代码复杂度为O(n*(a1+a2+...+am))
我们可以发现
dp[i][j] =dp[i-1][j]+dp[i-1][j-1]+....+dp[i-1][j-t]
dp[i][j-1] =dp[i-1][j-1]+dp[i-1][j-2]+....+dp[i-1][j-t]+dp[i-1][j-t-1]
所以dp[i][j]=dp[i][j-1]-dp[i-1][j-t-1]+dp[i-1][j];
样例:
3个球,3个桶,容量分别为{1,2,3},共有多少取法。
答案6(0+0+3,0+1+2,0+2+1,1+1+1,1+2+0,1+0+2)
#i