题意:给出n种不同的花,给出最大的摆放数量m,给出不同的花的数量
问:不同摆放的方案数;
思路:dp【i】【j】表示放置前i种不同的花,在摆放j数量时的方案数
那么我们就是从前1种到前n种依次遍历
在遍历的时候再来一维 表示在摆放前i种花时,摆放j数量的方案数的枚举更新
第三维:枚举的时候只能枚举当前花的最大数量范围内,但是有可能最大数量超过j所以min(j,a[i])
代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=105; 4 const int mod=1000007; 5 int a[maxn]; 6 int dp[maxn][maxn]; 7 int main() 8 { 9 int n,m; 10 scanf("%d%d",&n,&m); 11 for(int i=1;i<=n;i++) 12 scanf("%d",&a[i]); 13 dp[0][0]=1; 14 for(int i=1;i<=n;i++) 15 for(int j=0;j<=m;j++) 16 for(int k=0;k<=min(j,a[i]);k++) 17 dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod; 18 printf("%d\n",dp[n][m]); 19 return 0; 20 }
原文:https://www.cnblogs.com/pangbi/p/12555080.html