#include<iostream>
using namespace std;
static const int N = 7500;
static int f[21][2 * N + 1];
static int p[21], w[21];
int main()
{
int c, g;
cin >> c >> g;
int i, j, k;
for (i = 1; i <= c; i++)
cin >> p[i];
for (i = 1; i <= g; i++)
cin >> w[i];
for (k = 1; k <= c; k++)
f[1][w[1] * p[k] + N ]++; /* avoid minus index */
for (i = 2; i <= g; i++)
{
for (j = 0; j <= 2 * N; j++)
{
if (f[i - 1][j] != 0)
{
for (k = 1; k <= c; k++)
{
f[i][j + w[i] * p[k]] += f[i - 1][j];
}
}
}
}
cout << f[g][N] << "\n";
return 0;
}
得到递推公式是解决该题关键。
f[i][j] : 装i个物品,得到的权重是j时,共有几种方法。
-1500 <= j <= 1500
f[i][j] = SUM(