=====================================================
现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。
注:
称重重量包括0
要对输入数据进行校验
方法原型:public static int fama(int n, int[] weight, int[] nums)
知识点 字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
运行时间限制 10M
内存限制 128
输入
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<>
输出
利用给定的砝码可以称出的不同的重量数
样例输入 2 1 2 2 1
样例输出 5
=====================================================
一次通过 100分
========================================================
package package02;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
//现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。
//
//注:
//称重重量包括0
//要对输入数据进行校验
//
//方法原型:public static int fama(int n, int[] weight, int[] nums)
//
//知识点 字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
//运行时间限制 10M
//内存限制 128
//输入
//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<>
//
//输出
//利用给定的砝码可以称出的不同的重量数
//样例输入 2 1 2 2 1
//样例输出 5
public class oj048 {
TreeSet<Integer> set=new TreeSet<>(); //保存组合的重量 没有重复
public void fama(int n, int[] weight, int[] nums,int allweight)
{
//注意参数为数组时 传入的是数组的首地址
//继续递归情况
for(int i=0;i<n;i++)
{
if(nums[i]!=0)
{
nums[i]=nums[i]-1;
//不拿此砝码
set.add(allweight);
fama(n,weight,nums,allweight);//不拿此砝码
set.add(allweight+weight[i]);
fama(n,weight,nums,allweight+weight[i]);//拿此砝码
nums[i]=nums[i]+1; //这句话非常重要 将修改过的参数值恢复 以免影响接下来的计算
}
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int [] weight=new int[n];
int [] nums=new int[n];
for(int i=0;i<n;i++)
{
weight[i]=scanner.nextInt();
}
for(int i=0;i<n;i++)
{
nums[i]=scanner.nextInt();
}
oj048 oj=new oj048();
oj.fama(n, weight, nums,0);
System.out.print(oj.set.size());
// for(Integer i:oj.set)
// {
// System.out.print(i+" ");
// }
//
}
}