pku 1837 01背包
#include <iostream>
using namespace std;
const int MAXN = 15*25*20;
int w[21], v[21];
int dp[21][MAXN*2+1];
int main()
{
int C, G;
while (scanf("%d %d", &C, &G) != EOF)
{
int i, j, k;
memset(dp, 0, sizeof(dp));
for (i = 0; i < C; ++i)
{
scanf("%d", &v[i]);
}
for (i = 0; i < G; ++i)
{
scanf("%d", &w[i]);
}
for (i = 0; i < C; ++i)
{
dp[0][MAXN+v[i]*w[0]]++;
}
for (i = 1; i < G; ++i)
{
for (j = -MAXN; j <= MAXN; ++j)
{
int sum = 0;
for (k = 0; k < C; ++k)
{
int p = MAXN+j-v[k]*w[i];
if (p >= 0)
{
sum += dp[i-1][p];
}
}
dp[i][MAXN+j] = sum;
}
}
printf("%d\n", dp[G-1][MAXN]);
}
return 0;
}
浙公网安备 33010602011771号