每个桶的容量为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)
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n=3;
int m=3;
int a[]= {-1,1,2,3}; //第i个桶容量a[i],桶0不存在
int dp[4][4];
for(int i=0;