称砝码

描述

现有一组砝码,重量互不相等,分别为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
package com.oj5;

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class Test {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int num = in.nextInt();
		int[] weights = new int[num];
		int[] nums = new int[num];
		int[] flag = new int[1001];
		for(int i = 0;i < num; i++){
			weights[i] = in.nextInt();
		}
		
		for(int i = 0;i < num; i++){
			nums[i] = in.nextInt();
		}
		
//		for(int i = 0;i < flag.length; i++)
//			System.out.println(flag[i]);
		
		flag[0] = 0;
		for(int i = 0;i < num; i++)
			for(int j = 1;j <= nums[i]; j++){					//循环砝码个数次数,每次增加一个重量为weights[i]的新砝码
				int max = flag[0];
				for(int k = 1;k <= flag[0]; k++){				//新添加一个砝码同以前的已有重量合成的新重量,从1到已有的最大重量开始,添加一个weights[i]重量砝码,看看是否有新重量出现
					if(flag[k]==1&&flag[k+weights[i]]==0){
						flag[k+weights[i]] = 1;
						if(k+weights[i]>max)
							max=k+weights[i];
					}
				}
				
				flag[j*weights[i]] = 1;							//单纯j个质量为weight[i]的砝码放在一起产生的新重量
				
				flag[0] = max> (j*weights[i])?max:j*weights[i];
			}

		

		int count = 1;
		for(int i = 0;i < flag.length; i++)
			if(flag[i]==1)
				count++;
		System.out.println(count);
	}
}

  

原文地址:https://www.cnblogs.com/lxk2010012997/p/5394276.html