#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> weights(n); // 每种砝码的重量
vector<int> counts(n); // 每种砝码的数量
// 读取砝码重量
for (int i = 0; i < n; i++) {
cin >> weights[i];
}
// 读取砝码数量
for (int i = 0; i < n; i++) {
cin >> counts[i];
}
// 计算可能的最大重量
int max_weight = 0;
for (int i = 0; i < n; i++) {
max_weight += weights[i] * counts[i];
}
// 创建二维dp数组,dp[i][j]表示使用前i种砝码能否称出重量j
vector<vector<bool>> dp(n + 1, vector<bool>(max_weight + 1, false));
// 初始状态:不使用任何砝码可以称出重量0
dp[0][0] = true;
// 动态规划过程
for (int i = 1; i <= n; i++) {
// 获取当前砝码的重量和数量
int weight = weights[i - 1];
int count = counts[i - 1];
// 对于每个可能的重量j
for (int j = 0; j <= max_weight; j++) {
// 首先,如果不使用当前砝码,则沿用前i-1种砝码的结果
dp[i][j] = dp[i - 1][j];
// 尝试使用不同数量的当前砝码
for (int k = 1; k <= count; k++) {
// 如果当前重量减去k个当前砝码后的重量能被称出,那么当前重量也能被称出
if (j >= k * weight && dp[i - 1][j - k * weight]) {
dp[i][j] = true;
break;
}
}
}
}
// 计算可以称出的不同重量数量
int count = 0;
for (int j = 0; j <= max_weight; j++) {
if (dp[n][j]) {
count++;
}
}
cout << count << endl;
return 0;
}