背包
dp[i][j] 表示从前j种物品里凑出体积i的方法数
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <limits.h>
#include <iomanip>
#include <queue>
using namespace std;
typedef long long LL;
typedef vector<int> vec;
//#pragma GCC optimize(2)
static vector<vec> dp(45, vec(25));
static vector<int> G(25);
static int N;
int main()
{
freopen("E:\\Desktop\\data.txt", "r", stdin);
//ios::sync_with_stdio(false);
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> G[i];
}
for (int i = 0; i <= N; i++) {
dp[0][i] = 1;
}
for (int i = 1; i <= 40; i++) {
for (int k = 1; k <= N; k++) {
dp[i][k] = dp[i][k-1]; // 不选第k个物品
if(G[k] <= i) //选第k个物品
dp[i][k] += dp[i-G[k]][k-1];
}
}
cout << dp[40][N] << endl;
return 0;
}