题目描述:

现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。

注:

称重重量包括0;

要对输入数据进行校验

方法原型:public static int fama(int n, int[] weight, int[] nums)

题目分析:

1,遇到这种问题我们最容易想到的解决思路应该就是穷举法了,实际上穷举法是大多数算法的实现基础,只不过优秀的算法能够根据之前已经计算出的部分结果来对以后的计算进行剪枝或者简化计算罢了。这里我们也利用穷举算法来解决;

2,不过对于穷举法来说,最大的制约在于两点:穷举的时空开销和穷举本身的难度。我们暂不考虑复杂度的问题,由于事先并不清楚砝码的种类个数,因此无法用传统的多重循环来遍历所有的可能情况,。这里我给大家提供一个思路,基本上对于类似的穷举问题都是通用的;

3,让我们这样考虑,总共的放置方法totalConditions = (num[0] + 1) * (num[1] + 1) * ... * (num[num.length - 1] + 1),注意砝码个数可以为零;

   我们构建一个位数为weight.length的数,从左至右依次为重量为weight[0], weight[1], ... 的砝码的个数,那么这实际上是一个可变进制的n位数,从左至右进制依次为(num[0] + 1), (num[0] + 1), ...

因此我们对数字进行0到(totalConditions - 1)的遍历,便可根据这个数字计算出对应的各种砝码的个数,从而得到称重重量,进而我们用一个HashSet来存放结果,最后HashSet的Size便是结果数了。

具体代码(Java实现):

 import java.util.HashSet;
import java.util.Scanner; public class Weight {
public static void main(String[] args) { @SuppressWarnings("resource")
Scanner reader = new Scanner(System.in);
int num = reader.nextInt();
int[] weight = new int[num];
int[] nums = new int[num];
for (int i = 0; i < num; i ++) {
reader.nextLine();
weight[i] = reader.nextInt();
}
for (int i = 0; i < num; i ++) {
reader.nextLine();
nums[i] = reader.nextInt();
}
getResultCount(num, weight, nums); } public static void getResultCount(Integer num, int[] weight, int[] nums) {
HashSet<Integer> results = new HashSet<Integer>();
int caseCount = 1;
for (int i = 0; i < nums.length; i ++) {
caseCount *= (nums[i] + 1);
}
int[] specificCase = new int[num];
for (int i = 0; i < caseCount; i ++) {
int l = i;
for (int j = 0; j < num; j ++) {
specificCase[num - j - 1] = l % (nums[num - j - 1] + 1);
l = l / (nums[num - j - 1] + 1);
}
results.add(calculate(weight, specificCase));
}
System.out.println(results.size());
} public static int calculate(int[] weight, int[] specificCase) { int weights = 0;
for (int i = 0; i < weight.length; i ++) {
weights = weights + weight[i] * specificCase[i];
}
return weights;
} }

华为OJ之放砝码的更多相关文章

  1. 华为OJ平台——放苹果(典型整数划分问题)

    题目描述: 输入m,n,分别表示苹果数与盘子的总数,要求输出苹果放在n个盘子的方法总数(注意511和151是一种情况),例如输入 7 3 输出8((7),(6,1),(5,2),(4,3),(5,1, ...

  2. 华为OJ之放苹果

    题目描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入每个用例包含二个整数M和N.0<=m< ...

  3. 华为OJ:2041 放苹果

    这道题难点不在于代码怎么写,而是思路怎么想. 感觉一般这样的题要么你理好一个思路要么你最后总结出一个公式,要么你自己模拟它的运作方式,用迭代,或者递归的方式来做. 有点像我们曾经学的排列组合. 对于m ...

  4. 华为OJ:火车进站

    火车进站 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号. 输入描述: 有多组测试用例, ...

  5. 在华为oj的两个月

    一次偶然的机会,我接触到华为oj平台(http://career-oj.huawei.com/exam/camLogin.jsp),当时的心情很是兴奋,于是立马注册开通,然后迫不及待地上去做题.刚开始 ...

  6. 华为OJ题目:刷题

    题目描述: 新入职华为的小伙伴们都有在oj上面刷题的任务,共需要刷100道初级题,45道中级题,5道高级题,其中,做出来的高级题如果超标可以当初级或者中级题,做出来的中级题如果超标可以当初级题.每天, ...

  7. 华为OJ平台——字符串分隔

    题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输 ...

  8. 华为OJ平台——输出最小的k个数

    输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...

  9. 矩阵乘法的运算量计算(华为OJ)

    题目地址: https://www.nowcoder.com/practice/15e41630514445719a942e004edc0a5b?tpId=37&&tqId=21293 ...

随机推荐

  1. 每天一个JS 小demo之日历制作。主要知识点:日期函数

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. eclipse 创建maven 项目 动态web工程报错

    Eclipse 创建maven 项目 动态web工程 注:Eclipse版本为(Version: Mars.1 Release (4.5.1))maven版本为(apache-maven-3.3.9) ...

  3. JavaScript设计模式_02_策略模式

    在程序设计中,我们常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现.这些算法灵活多样,而且可以随意互相替换.这种解决方案就是所谓的策略模式. /* * pre:策略模式 * 示例:公司计算奖 ...

  4. 分页简单的封装SSM+easyUi

    public class Page { private int page = 1; //初始页 private int rows = 10; //一页多少行数据 private String q;// ...

  5. 分清css的em和rem

    在css中单位长度用的最多的是px.em.rem,这三个的区别是: px是固定的像素,一旦设置了就无法因为适应页面大小而改变. em和rem相对于px更具有灵活性,他们是相对长度单位,意思是长度不是定 ...

  6. Java代码编写规范(不是标准规范,自行整理,无须纠结)

    最近回过头来给以前的项目增加功能,发现之前写的注释非常不全,代码也非常的不整洁,有些地方写的''窝七八烂的,看着很不舒服:又恰好经理最近也经常跟我提起代码规范,我们就讨论了一下代码规范的重要性和必要性 ...

  7. JQuery与js具体使用的区别(不全,初学)

    jQuery能大大简化Javascript程序的编写 要使用jQuery,首先要在HTML代码最前面加上对jQuery库的引用,比如: <script language="javasc ...

  8. Bash中单引号和双引号的区别

    单引号和双引号的区别 单引号:必须成对使用,它可以保护所有的字符不被翻译.如变量$1,和奇数个单引号的作用相同,偶数个单引号=1个双引号双引号:必须成对出现,它可以保护一些元字符不被翻译,但允许变量和 ...

  9. 第2章 系统用户/组管理(2) su和sudo

    本文目录: 2.1 su 2.2 sudo 2.2.1 /etc/sudoers文件 2.2.2 sudo和sudoedit命令 2.1 su 切换用户或以指定用户运行命令. 使用su可以指定运行命令 ...

  10. mybatis if test加筛选条件

    最近在项目使用mybatis中碰到个问题 <if test="type=='y'"> and status = 0 </if> 当传入的type的值为y的时 ...