#include<cstdio>#include<iostream>
using namespace std;constint MOD =1000007;int n, m, a[105], f[105][105];//用x种花,摆放y盆的方案数 intdfs(int x,int y){if(f[x][y])return f[x][y];if(y ==0){
f[x][y]=1;//用x种花摆放0盆的方案数是1 }elseif(y <0){
f[x][y]=0;//用x种花摆放(负数)盆的方案数是1 }elseif(x ==0){//用0种花摆放y盆的方案数是0
f[x][y]=0;}else{for(int i =0; i <= y && i <= a[x]; i ++){
f[x][y]=(f[x][y]+dfs(x -1, y - i))% MOD;}}return f[x][y];}intmain(){
cin >> n >> m;for(int i =1; i <= n; i ++) cin >> a[i];
cout <<dfs(n, m);return0;}
多重背包求方案数
#include<bits/stdc++.h>usingnamespace std;constint MOD =1000007;int n, m;int f[109][109];//f[i][j]:前i种花,摆放j盆的方案数intmain(){
cin >> n >> m;//无论用几种花,摆放0盆的方案数都是1 for(int i =0; i <= n; i ++) f[i][0]=1;for(int i =1; i <= n; i ++){int a;
cin >> a;for(int j =1; j <= m; j ++){for(int k =0; k <= j && k <= a; k ++){
f[i][j]=(f[i][j]+ f[i -1][j - k])% MOD;}}}
cout << f[n][m];return0;}
压缩成一维数组
#include<bits/stdc++.h>usingnamespace std;constint MOD =1000007;int n, m;int f[109];//f[i][j]:前i种花,摆放j盆的方案数intmain(){
cin >> n >> m;//无论用几种花,摆放0盆的方案数都是1
f[0]=1;for(int i =1; i <= n; i ++){int a;
cin >> a;for(int j = m; j >=1; j --){for(int k =1; k <= j && k <= a; k ++){
f[j]=(f[j]+ f[j - k])% MOD;}}}
cout << f[m];return0;}
摆花递归#include <cstdio>#include <iostream>using namespace std;const int MOD = 1000007;int n, m, a[105], f[105][105];//用x种花,摆放y盆的方案数 int dfs(int x, int y) { if (f[x][y]) return f[x][y]; if (y == 0) { f[x][y] = 1; //用x种花摆放0盆的方案数是