描述
现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。注:
称重重量包括 0
数据范围:每组输入数据满足 1≤�≤10 1≤n≤10 , 1≤��≤2000 1≤mi≤2000 , 1≤��≤10 1≤xi≤10
输入描述:
对于每组测试数据:
第一行:n --- 砝码的种数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每种砝码对应的数量(范围[1,10])输出描述:
利用给定的砝码可以称出的不同的重量数
示例1
输入:
2 1 2 2 1输出:
5说明:
可以表示出0,1,2,3,4五种重量。
import java.util.*;
import java.math.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int a = in.nextInt();
List<Obj> list = new ArrayList<>();
int[] a1 = new int[a];
int[] a2 = new int[a];
for (int i=0; i<a; i++) {
a1[i] = in.nextInt();
}
for (int i=0; i<a; i++) {
a2[i] = in.nextInt();
}
for (int i=0; i<a; i++) {
list.add(Obj.build(a1[i], a2[i]));
}
Set<Integer> set = new HashSet<>();
System.out.println(dealCount(list));
}
}
public static int dealCount(List<Obj> list) {
int h = list.stream().mapToInt(o -> o.c*o.w).sum()+1;
int w = list.size()+1;
int[][] dp = new int[h][w];
for (int i=1; i<h; i++) {
dp[i][0] = 1;
}
for (int i=0; i<w; i++) {
dp[0][i] = 1;
}
for (int i=1; i<h; i++) {
for (int j=1; j<w; j++) {
Obj o = list.get(j-1);
for (int k=0; k<=o.c; k++) {
int val = o.w * k;
if (j == 1) {
if (i == val) {
dp[i][j] = 1;
}
}
else {
if (val == 0) {
}
else if (i-val > 0 && j-1>0) {
for (int l=1; l<j; l++) {
if (dp[i-val][l] == 1) {
dp[i][j] = 1;
break;
}
}
}
else if (i-val == 0){
dp[i][j] = 1;
}
}
}
}
}
int sum = 1;
for (int i=1; i<h; i++) {
for (int j=1; j<w; j++) {
if (dp[i][j] > 0) {
sum +=1;
break;
}
}
}
return sum;
}
public static void dealCount(List<Obj> list, int idx, int val, Set<Integer> set) {
if (idx == list.size()) {
if (!set.contains(val)) {
set.add(val);
return ;
}
return ;
}
Obj o = list.get(idx);
for (int i=0; i<=o.c; i++) {
dealCount(list, idx+1, val+o.w*i, set);
}
}
public static class Obj {
int w;
int c;
public static Obj build(int w, int c) {
Obj o = new Obj();
o.w = w;
o.c = c;
return o;
}
}
}