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