//DP,动态规划求组合数,dp[i][j]表示前i个重锤获得重量j有几种方式 //转移方程dp[i][j+k] += dp[i-1][j];k为新添加第I个重锤的质量 //对重锤对应钩子将其分组后来处理 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int dp[25][1000]; int C[25],G[25]; int N,M; const int mid = 500; void DP() { dp[0][mid] = 1;//初始化 for(int i = 1;i <= M;++i) { for(int k = 0;k < 1000;++k) { for(int j = 1;j <= N;++j) { if(dp[i-1][k] == 0) continue; dp[i][k + G[i]*C[j]] += dp[i-1][k]; } } } } int main() { //freopen("in.txt","r",stdin); while(scanf("%d%d",&N,&M) != EOF) { for(int i = 1;i <= N;++i) scanf("%d",&C[i]); for(int i = 1;i <= M;++i) scanf("%d",&G[i]); DP(); printf("%d/n",dp[M][mid]); } }