题目描述:

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

    hdu4638 题意 给定一个序列,序列由1-N个元素全排列而成,求任意区间可组成的连续的段数,比如[1,2,4]两段{[1,2],[4]},[1,2,4,3]一段{[1,2,3,4]}. 对于查询的 ...

  2. linux下部署php项目-Apache、php、mysql关联

    linux下部署php项目环境可以分为两种,一种使用Apache,php,mysql的压缩包安装,一种用yum命令进行安装. 使用三种软件的压缩包进行安装,需要手动配置三者之间的关系.apache和p ...

  3. TreeSet集合排序方式一:自然排序Comparable

    TreeSet集合默认会进行排序.因此必须有排序,如果没有就会报类型转换异常. 自然排序 Person class->实现Comparable,实现compareTo()方法 package H ...

  4. sublime 新手代码提示

    有提示的    你按   table   试试这就是按过的结果   是不是很方便这是按后的效果      是不是很方便 下面是各种简写效果html <html></html> ...

  5. mailto调用本地默认客户端发邮件

    下面介绍如何利用 Mailto功能: 实现 Mailto的基本html代码: <a href="mailto:123@qq.com">点击这里发邮件!</a> ...

  6. .NET 随记

    1. goto 常用于 switch语句中2. 字符串相加用 StringBuilder的Append()方法性能好3. str.Trim(',') 清除字符串后的","4. st ...

  7. sed的用法

    1.什么是sed sed命令是一个流线式.非交互式编辑器,可以实现在vi等编辑器中一样的编辑效果.   2.sed的工作原理 模式空间(pattern space) sed一次处理一行文本(或输入), ...

  8. SQL之trigger(触发器)

    先来看一小段程序 有如下三张表: 帐户(编号,姓名,余额,建立日期,储蓄所编号) 储蓄所(编号,名称,地址,人数,所属城市) 借贷(帐户,借贷类型,金额,日期) create trigger tri_ ...

  9. 开始学习机器学习,从Ng的视频开始

    时隔开5个月,忙完了考研和毕设后终于有时间搞自己想搞得,研究生导师方向是图像处理与机器学习结合,重新开工 何为机器学习? 对于机器学习(Machine Learning)的定义大体上有两种,第一种是美 ...

  10. Kubernetes部分Volume类型介绍及yaml示例

    1.EmptyDir(本地数据卷) EmptyDir类型的volume创建于pod被调度到某个宿主机上的时候,而同一个pod内的容器都能读写EmptyDir中的同一个文件.一旦这个pod离开了这个宿主 ...