题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
#include <stdio.h> #include <string.h> //不会做,借助榜一大佬的方法 int main() { int n; //输入所有的数据 while (scanf("%d", &n) != EOF) { int weight[n],num[n],i,j,k,total=0; for(i=0;i<n;i++) scanf("%d",&weight[i]); for(i=0;i<n;i++) scanf("%d",&num[i]); //计算出最大的重量 for(i=0;i<n;i++) total+=weight[i]*num[i]; //创建哈希表,表的下标代表重量,表的0或1代表这个重量是否能取到 int hash[total+1]; memset(hash,0,sizeof(hash)); hash[0]=1; //循环,如果某个重量存在,则这个重量加上砝码的重量也存在 for(i=0;i<n;i++) for(j=0;j<num[i];j++) for(k=total;k>=0;k--)//反向确认循环,正向的话会污染哈希表 if(hash[k]==1) hash[k+weight[i]]=1; //计算所有存在的重量 int count=0; for(i=0;i<total+1;i++) if(hash[i]==1) count++; printf("%d",count); } return 0; }