IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 砝码称重--JAVA -> 正文阅读

[Java知识库]砝码称重--JAVA

题目

在这里插入图片描述

主要思路

首先,上来第一眼看是一个很简单的排列组合问题,但是暴力算法肯定是超时的。废话不多说,上代码。

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public class Main {
	
	public static void main(String[] args) 
	{
		Scanner in =new Scanner(System.in);
		int N,i,temp,tt;
		N=in.nextInt();        
		int[] num=new int[N];
		for ( i = 0; i < N; i++) 
			num[i]=in.nextInt();
		Set<Integer> contain =new HashSet<>();
		List<Integer> a =new LinkedList<>();        //存放中间变量,一次遍历中,容器不存在 的数
		contain.add(Integer.valueOf(num[0]));     //先将第一个元素填入到容器
		for(i=1;i<N;i++)
		{
			for (Iterator<Integer> iter =contain.iterator();iter.hasNext();) {
				tt=iter.next().intValue();
				temp=tt+num[i];
				if(temp!=0&&temp<100000&&!contain.contains(Integer.valueOf(temp)))
					a.add(Integer.valueOf(temp));
				temp=tt-num[i];
				temp=Math.abs(temp);   //砝码差的绝对值
				if(temp!=0&&temp<100000&&!contain.contains(Integer.valueOf(temp))&&!a.contains(Integer.valueOf(temp)))
						a.add(Integer.valueOf(temp));
			}
			contain.addAll(a);
			a.clear();
			if(!contain.contains(Integer.valueOf(num[i])))
				contain.add(Integer.valueOf(num[i]));
		}
		System.out.println(contain.size());
	}
}

记录一下自己第一次全部AC,可能有更好的思路,但是下面还是讲一下我的思路吧!

思路

首先,对于这种需要很多组合的问题,肯定是动态规划了。首先将第一个砝码放入右边,目前只有一种组合。继续放入第二个砝码,你可以选择继续放到右边或者左边。放入右边其实逻辑上就是砝码A+砝码B,放入左边就是砝码A-砝码B结果的绝对值。剩下的就是重复一直放入砝码。
在代码实现中,我选择的数据结构是HashSetLinkedList。HashSet用于存放加完砝码的结果。而LinkedList用于存放加砝码时的不确定砝码值。
为什么不直接将加完的值全放进HashSet中,非得加一个LinkedList。因为如果直接加入,那么就对上一次的砝码称重的结果,造成了影响。意思就是,你刚加出来的结果,有会被踢出去,被这个重量的砝码再运算一次。
例如:

HashSet : 1 2 4

这次要加入的砝码是 6
首先1 + 6 = 7

那么HashSet: 1 2 4 7

到最后 7 + 6 = 13

HashSet: 1 2 4 7 13

实际上,这里的6用了两次,你把用这次砝码6运算出来的结果7,又加了一次6,变成了13.显然,这个结果是错误的。
我选择将一次迭代的结果,先放在LinkedList容器中,最终一并放入HashSet中.

第二次代码

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class Main {
	
	public static void main(String[] args) 
	{
		Scanner in =new Scanner(System.in);
		int N,i,temp,tt;
		N=in.nextInt();        
		int[] num=new int[N];
		for ( i = 0; i < N; i++) 
			num[i]=in.nextInt();
		Set<Integer> contain =new HashSet<>();
		Set<Integer> a =new HashSet<>();        //存放中间变量,一次遍历中,容器不存在 的数
		contain.add(Integer.valueOf(num[0]));     //先将第一个元素填入到容器
		for(i=1;i<N;i++)
		{
			for (Iterator<Integer> iter =contain.iterator();iter.hasNext();) {
				tt=iter.next().intValue();
				temp=tt+num[i];
				if(temp!=0&&temp<100000)
					a.add(Integer.valueOf(temp));
				temp=tt-num[i];
				temp=Math.abs(temp);
				if(temp!=0&&temp<100000)
						a.add(Integer.valueOf(temp));
			}
			contain.addAll(a);
			a.clear();
			if(!contain.contains(Integer.valueOf(num[i])))
				contain.add(Integer.valueOf(num[i]));
		}
		System.out.println(contain.size());
	}
}

最新的改进:
很明显if语句中的限制条件变少了。因为我运用HashSet的性质,无序、不可重复。使用两个HashSet,每次运算的结果。不用再判断在原来出现过!直接将所以的结果都加入,如果重复会直接加入失败。
第一版本的代码是用
contains( )方法
去判断,是否在原来的容器中出现,HashSet对于查找效率很高,使用HashSet直接添加,他会先查找是否先前存在该值,明显的HashSet查找的效率会快于contains( )方法

在这里插入图片描述
全部AC的感觉太棒了!!!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-28 12:16:13  更:2021-10-28 12:17:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:27:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码