参考大家的 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);
}
给了注释