动态规划也是可以的: 表示前个砝码是否能称量的重量, 转移方程:

while 1:
    try:
        n = input()
    except:
        break
    n = int(n)
    weights_str = input().split(' ')
    weights = []
    for elem in weights_str:
        weights.append(int(elem))
    nums_str = input().split(' ')
    nums = []
    for elem in nums_str:
        nums.append(int(elem))

    max_weight = 0
    for i in range(n):
        max_weight += nums[i] * weights[i] 
    dp = [[0 for i in range(max_weight + 1)] for j in range(n + 2)]

    M = 1
    dp[0][0] = 1
    for i in range(1, n + 1):
        for w in range(M):
            for j in range(nums[i - 1] + 1):
                if dp[i - 1][w] == 1:
                    dp[i][w + j * weights[i - 1]] = 1
                    M = max(w + j * weights[i - 1] + 1, M)
    ans = sum(dp[n])
    print(ans)