using System; using System.Collections.Generic; using System.Linq; namespace HJ41 { /// <summary> /// 核心思想: /// 将所有砝码即使展开到一个列表中去, /// 遍历列表中的所有砝码去求所有可能的和然后去重 /// 核心推导:这次和的集合=上次的和集合 + 这次新产生的和的集合 /// 这次新产生的和集合=上次和的集合中的和 + 新加入的砝码 /// </summary> internal class Program { static void Main(string[] args) { int weightClass = int.Parse(Console.ReadLine()); string[] weightWeightStr = Console.ReadLine().Split(); string[] weightCountStr = Console.ReadLine().Split(); List<int> weightList = new List<int>(); for (int i = 0; i < weightClass; i++) { int ww = int.Parse(weightWeightStr[i]); int wc = int.Parse(weightCountStr[i]); //相同重量砝码,按数量添加到列表中 for (int j = 0; j < wc; j++) { weightList.Add(ww); } } HashSet<int> sums = new HashSet<int>(); sums.Add(0); for (int i = 0; i < weightList.Count; i++) { //拿到上一次(i-1)个所有可能的和的集合 List<int> temp = new List<int>(sums); //算出加上这次这个砝码生成的新和的集合 //并将新产生的和的集合加入到最终的集合中去 for (int j = 0; j < temp.Count; j++) { sums.Add(temp[j] + weightList[i]); } } //去重,输出 Console.WriteLine(sums.Count); } } }