这道题花了我挺多时间的,有一个多小时吧(而且还是在看了大佬的思路前提下),菜鸡本人是我没错了。o(╥﹏╥)o
因为这道题并不是完全靠我自己想出来的,所以我觉得一个由不会变成会的人可能反而更能讲清楚这道题的思路应该是怎样的。
直接上代码吧!
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String nString = in.nextLine();
Integer n = Integer.valueOf(nString);
String[] weightsSting = in.nextLine().split(" ");
//各砝码重量
int[] weights = new int[n];
for (int i = 0; i < weightsSting.length; i++) {
weights[i] = Integer.valueOf(weightsSting[i]);
}
String[] numsSting = in.nextLine().split(" ");
//各砝码个数
int[] nums = new int[n];
for (int i = 0; i < numsSting.length; i++) {
nums[i] = Integer.valueOf(numsSting[i]);
}
//所有砝码重量组合情况set
HashSet<Integer> hashSet = new HashSet<>();
//由示例可知,0重量也属于一种情况
hashSet.add(0);
for (int i = 0; i < n; i++) { //每一种砝码
//加上该种砝码后会多出现哪些情况,统计好后一次性一次性合并,而不是边找到一个情况边直接往hashSet中添加
HashSet<Integer> thisTimeNeedAddSet = new HashSet<>();
for (int k = 1; k <= nums[i]; k++) { //该种砝码取多少个
//该种砝码取k个的重量
int singleTimeAddWeight = weights[i] * k;
//之前hashSet中所有的情况都是没有包含该种砝码的,所以我们现在需要将之前的所有情况都加上包含该种砝码的情况
for (Integer weight : hashSet) {
//只添加k个砝码的情况不要忘记加上哦
thisTimeNeedAddSet.add(singleTimeAddWeight);
//之前的情况 加上 添加k个砝码的情况
thisTimeNeedAddSet.add(weight + singleTimeAddWeight);
}
}
//将这次产生的新情况,与之前的情况进行汇总,去重
hashSet.addAll(thisTimeNeedAddSet);
}
System.out.println(hashSet.size());
}
}
}
最后附上我的运行时间和占用内存,哈哈哈哈哈哈![!alt]!(https://uploadfiles.nowcoder.com/images/20220626/454171173_1656206485064/744BAE10327B6E0EE5C05234FDC92B8D) 喂!这么差劲你是怎么好意思网上贴的?????!!!!!!哈哈哈哈,主要是想跟大家说一下思路,至于怎么这么慢,我也不知道怎么回事的说!╮(╯▽╰)╭