题目描述:

现有一组砝码,重量互不相等,分别为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. Python3网络爬虫

    # 最近在实验楼学习了爬取妹子图,发现在运行的时候不是很流畅,有些图片下 1 # coding: utf-8 # coding: utf-8 import re import threading fr ...

  2. 动态添加Redis密码认证

    如果redis已在线上业务使用中,但没有添加密码认证,那么如何在不影响业务服务的前提下给redis添加密码认证,就是一个需要仔细考虑的问题. 本文描述一种可行的方案,适用于客户端使用了jedis连接池 ...

  3. pb传输优化浅谈

    在正式切入今天要谈的优化之前,先碎碎念一些自己过去这几年的经历.很久没有登录过博客园了,今天也是偶然兴起打开上来看一下,翻看了下自己的随笔,最后一篇原创文章发布时间是2015年的4月,今天是2017年 ...

  4. linux--centos服务器配置

    配置Centos服务器   1. 安装centos 安装时注意分区留下一个/data区给网站内容存储. 2. 配置网络连接 默认centos网络连接不是开机启动的,需要配置. vi /etc/sysc ...

  5. AES加密解密算法---java

    package com.BFGJ.AES; import java.util.Random; import java.util.StringTokenizer; import javax.crypto ...

  6. WLAN高密无线网络部署的信道问题

    WIFI信号的信道有两部分,其中2.4G频段有13个左右交叠的信道(14信道只在日本使用),其中只能找出3个相互不重合的信道(具体请参考文末的链接),最常用的就是1.6.11这三个,当然也可以使用其他 ...

  7. Unity3D 骨骼动画原理学习笔记

    最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...

  8. BarTender 通过ZPL命令操作打印机打印条码, 操作RFID标签

    注:    由于工作需要, 也是第一次接触到打印机的相关内容, 凑巧, 通过找了很多资料和帮助后, 也顺利的解决了打印标签的问题 (标签的表面信息[二维码,条形码, 文字] 和 RFID标签的EPC写 ...

  9. SpringMVC学习资料

    一.SpringMVC 1.helloworld 1.导包 <dependency> <groupId>org.springframework</groupId> ...

  10. MongoDB-配置翻译

    Configuration File(配置文件) File Format(文件格式) Use the Configuration File(使用配置文件) Core Options(核心设置) sys ...