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;
}

posted on 2009-07-23 19:02  ZAFU_VA  阅读(278)  评论(0)    收藏  举报

导航