参考大家的 C 语言版本 
#include<stdio.h>

int main(){
    int n;
    int *m;
    int *x;
    scanf("%d",&n);
    m = (int*)malloc(sizeof(int)*n);
    x = (int*)malloc(sizeof(int)*n);
    int t;
    for(int i=0;i<n;i++){
        scanf("%d",&m[i]);
    }
    for(int i=0;i<n;i++){
        scanf("%d",&x[i]);
    }
    
    int total = 0;
    for(int i=0;i<n;i++){
        total = total+m[i]*x[i];
    }
    
    int * wight_toal = (int*)malloc(sizeof(int)*(total+1)); // +1是考虑重量为0的情况
    for(int i=0;i<total+1;i++){
        wight_toal[i] = 0;  // 不能用memset设置0了
    }
    wight_toal[0] = 1;
    for(int i = 0;i<n;i++){
        for(int j=0;j<x[i];j++){
            for(int k = total;k>=0;k--){      // k表示所有可能的重量
                if(wight_toal[k]==1){         // 找到最新组合的重量(类似与ip掩码中倒着找最后一个1)
                    int next_weight = k+m[i]; // 下一个能组合的重量
                    wight_toal[next_weight] = 1;
                }
            }
        }
    }
    
    int N = 0;
    for(int i=0;i<total+1;i++){
        N+=wight_toal[i];
    }
    printf("%d",N);
    free(m);
    free(x);
    free(wight_toal);
}

给了注释