现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。
输入
int n:n表示有多少组重量不同的砝码,1<=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<> int[] weight:表示n组砝码的重量,1<=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<> int[] num:表示n组砝码的最大数量,1<=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<>
| |
输出 | 利用给定的砝码可以称出的不同的重量数 |
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main{
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
Set<Long> result=new HashSet<Long>();
int n=scanner.nextInt();
int[] weight=new int[n];
int[] num=new int[n];
for(int i=0;i<n;i++)
weight[i]=scanner.nextInt();
for(int j=0;j<n;j++)
num[j]=scanner.nextInt();
int count=count(0,weight,num,n,0,result);
System.out.println(count);
}
public static int count(long curNum,int[] weight, int[] num, int n, int i,Set<Long> result) {
long temp;
if(i<n){
for(int j=0;j<=num[i];j++){ //每个砝码可选择0-num[i]个
temp=curNum+weight[i]*j;
if(i==n-1) //n个砝码选择完毕,保存结果
result.add(temp);
count(temp,weight,num,n,i+1,result);//选择下一个砝码
}
}
return result.size();
}
}