注意这里每个砝码都要用上,所以状态转移时只转移上一个砝码用上的情况。由于这里要求的是种数,直接相加就可以了,所以加的值如果是0就代表上一个(或多个)砝码没有用上的情况对本状态没有贡献
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define MAXN 25
#define MAXM 16000
#define MID 7550
using namespace std;
int n,m;
int arm[MAXN],weight[MAXN],dp[MAXN][MAXM];
void init(){
for(int i=1;i<=n;i++)
cin>>arm[i];
for(int i=1;i<=m;i++)
cin>>weight[i];
memset(dp,0,sizeof(dp));
dp[0][0+MID]=1;
}
void solve(){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
for(int t=0;t<MAXM;t++){
dp[i][t]+=dp[i-1][t-(arm[j]*weight[i])];
}
}
}
cout<<dp[m][MID]<<endl;
}
int main(){
while(cin>>n>>m){
init();
solve();
}
return 0;
}