`
jsltool
  • 浏览: 23516 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
文章分类
社区版块
存档分类
最新评论

从数组中找出最合适的组合

阅读更多

用js写的一个找最佳组合的代码。从一堆数字中找到和最接近指定数字的组合。没有用到递归,直接把所有的组合都找出来,然后从中找到最符合的组合显示出来。没有加注释,但肯定能用。

 

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>找组合</title>
		<meta http-equiv="keywords" content="找组合">
		<meta http-equiv="description" content="从一堆数据中找出合适的组合">
		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
	</head>
	<script type="text/javascript">
var IN,TARGET,TMP=new Array(64);
function sort(){
	for(var i=0;i<IN.length;i++){
		for(var j=IN.length-1;j>i;j--){
			if(IN[j-1]>IN[j]){
				var t=IN[j-1];
				IN[j-1]=IN[j];
				IN[j]=t;
			}
		}
	}
}
function loc(state){
	var size=0;
	for(var i=0;i<IN.length;i++){
		if((state&(1<<i))!=0){
			TMP[size++]=i;
		}
	}
	return TMP.slice(0,size);
}
function sum(loc){
	var ans=0;
	for(var i=0;i<loc.length;i++){
		ans+=IN[loc[i]];
	}
	return ans;
}
function main(){
	eval("IN=["+document.getElementById("IN").value+"];");
	eval("TARGET=["+document.getElementById("TARGET").value+"];");
	sort();
	var MAX=1<<IN.length,allans=new Array(0);
	for(var l=1;l<=MAX;l++){
		if(sum(loc(l))>=TARGET){
			allans.push(l);
		}
	}
	print(allans);
}
function line(loc){
	var sum=0,ans="";
	for(var i=0;i<loc.length;i++){
		sum+=IN[loc[i]];
		ans+=IN[loc[i]]+" +";
	}
	return ans.substr(0,ans.length-1)+"="+sum;
}
function print(state){
	var minSum=state[0];
	var minLen=state[0];
	for(var i=0;i<state.length;i++){
		var locl = loc(state[i]), locS = loc(minSum), locL = loc(minLen);
		var suml = sum(locl), sumS = sum(locS), sumL = sum(locL);
		if (suml < sumS || (suml == sumS && locl.length < locS.length)) {
			minSum = state[i];
		}
		if (locl.length < locL.length
				|| ((locl.length == locL.length && suml < sumL))) {
			minLen = state[i];
		}
	}
	var lineM = line(loc(minSum)), lineL = line(loc(minLen));
	document.getElementById("message").innerHTML="最短组合:"+lineL+"</br>最近组合:"+lineM;
}
	</script>
	<body>
		从<input type="text" id="IN" value="88,18,9,100,4.8,6.4,50,41.3,8.9,27.5,50" />
		里面	<input type="button" id="IN" value="去找" onclick="main();" />
		<input type="text" id="TARGET" value="287.76" /></br></br>
		<div id="message" />
	</body>
</html>

 

分享到:
评论

相关推荐

    N选M的所有组合(递归与非递归实现)

    3. 对于每个可能的选择状态,从剩余未选择的元素中填充辅助数组,然后将该组合添加到结果集合。 4. 当所有可能的状态都被处理后,所有组合都被找到。 在实际编程中,递归方法可能更容易理解和实现,但可能会遇到栈...

    PHP实现多种类型的排列组合算法

    ]来计算组合数,然后从原数组中选择对应的元素。在PHP中,可以使用组合函数实现: ```php function combinations($arr, $k) { sort($arr); $result = []; combinationUtil($arr, $k, 0, $result, []); return $...

    关于数组的几道面试题1

    8. **找出数组中唯一的重复元素**: 可以使用“快慢指针”(龟兔赛跑)的方法,找到数组中的环,环的起始位置即为重复元素。 9. **找出出现奇数次的元素**: 所有元素异或一次,得到的结果就是出现奇数次的元素,...

    javascript 返回数组中不重复的元素

    在JavaScript中,有时我们需要处理包含重复项的数组,并希望从中提取出所有不重复的元素。这在数据处理、数组操作以及各种前端应用中非常常见。本文将详细介绍几种不同的方法来实现这一功能,并分析各自的优缺点。 ...

    树状数组优缺点及场景.zip

    3. 范围最值:虽然树状数组本身不直接支持,但可以通过组合其他数据结构(如单调栈或队列)来辅助找出区间内的最大值或最小值。 4. 频率统计:例如,统计一个数组中每个元素出现的次数,树状数组可以帮助高效地完成...

    利用Excel数组公式实现单条件求和.rar

    例如,如果我们要找出所有“苹果”商品的进货总金额,我们可以设定range为商品名称列,criteria为“苹果”,sum_range为对应的金额列。这样,SUMIF函数就能快速地计算出符合条件的单元格的和。 然而,当数据量庞大...

    js代码-两数组找出重复元素

    本话题聚焦于如何使用JS代码来找出存在于两个数组中的重复元素。这在数据分析、数据过滤或者优化算法性能等场景中非常实用。 首先,让我们理解基本概念。数组是存储有序元素的数据结构,可以包含任何类型的数据,如...

    在11,12,13,21,22,23,31,32,33任取五个数的和值为某一个值的所有组合

    在这个问题中,我们被要求找出从特定的数字集合 {11, 12, 13, 21, 22, 23, 31, 32, 33} 中任取五个数,其和等于某个特定值的所有可能组合。这个问题可以被看作是在一个无重复元素的九个数的数组中寻找特定和值的子集...

    php获取数组中重复数据的两种方法

    在PHP编程中,处理数组中的数据是一项非常常见的任务,其中有时候我们可能需要找出数组中重复的数据元素。为了达成这个目的,开发者可以利用PHP内置的函数来实现,也可以手动编写算法进行查找。本文将介绍两种方法来...

    用分治法求最大与最小值的问题

    对每个子数组,我们同样找出其中的最大值和最小值。 3. **合并**:将子问题的解组合起来得到原问题的解。对于最大值,取两个子数组的最大值中的较大者;对于最小值,取两个子数组的最小值中的较小者。 在C语言中,...

    选择合适的函数组合.pdf

    例如,RANK函数可以找出某个值在一组数据中的排名,而COUNTIF函数可以计算满足特定条件的单元格数量。 2. 多条件求和或计数:SUMPRODUCT函数非常实用,它可以同时处理多个条件并返回结果。例如,当需要对满足两个或...

    js代码-(算法)两个数组交集

    总之,寻找两个数组的交集是JavaScript编程中常见的算法问题,可以通过双重循环、Set操作或`reduce`与`filter`组合等多种方式解决。根据实际需求选择合适的方法,可以有效地提高代码的运行效率和可读性。

    java代码-给出一组候选数\ C C 和一个目标数\ T T,找出候选数中起来和等于\ T T 的所有组合。 \ C C 中的每个数字在一个组合中只能使用一次

    3. 每个数字仅能使用一次:这意味着每个数字在组合中不能重复出现。 解决此类问题通常采用递归的方法,结合回溯法来尝试所有可能的组合。以下是一个简单的Java代码实现: ```java public class CombinationSum { ...

    前端大厂最新面试题-dynamic-programming.docx

    2. 最长递增子序列:给定一个数组,找出其中的最长递增子序列。 例如,给定数组 [10, 9, 2, 5, 3, 7, 101, 18],其中的最长递增子序列是 [2, 3, 7, 101]。 3. 最短超级串:给定一个字符串,找出其中的最短超级串。...

    js代码-类数组转换数组

    在这个例子中,我们先找出所有数字键的最大值作为length,然后使用Array.from()生成新数组。 总的来说,JavaScript中类数组对象到数组的转换有多种方式,包括使用slice.call()、扩展运算符和Array.from()等。开发者...

    2021字节跳动面试参考手册.pdf

    - 通过建立哈希表或使用排序等方法找出数组中的重复数字。 以上内容涵盖了Java基础、Java集合框架、Linux常用指令、MySQL基础和数组处理等多个方面,是面试中常见的技术问题,也是IT行业技术面试的必考知识点。

    interview question

    根据给定的信息,我们可以将这个面试题目转换为一个具体的编程问题——如何找出数组中的元素组合,使得这些元素的和等于给定的目标值。本篇文章将会详细介绍这个问题的背景、解决思路以及可能采用的不同算法。 ### ...

    组合算法的PHP解答方法

    对于一个有N个不同元素的数组,要找出所有可能的k个元素的组合,可以使用组合公式C(N, k),其中C表示组合数,N是总元素数,k是要选取的元素数。这个公式可以表示为: \[ C(N, k) = \frac{N!}{k!(N-k)!} \] 其中"!...

    2014c语言必做题

    - 条件判断:通过条件语句比较找出最大值和最小值。 - 算术运算:加法`+`、除法`/`等基础运算的应用。 - **E03. 圆与球的计算** - 描述:从键盘输入一个浮点变量`r`,以`r`为半径,求相应的圆的周长和面积,以及...

    TIA博途SCL入门学习(二)常用基本控制语句用法和举例.docx

    类似地,我们也可以用FOR循环将数组元素清零或计算数组的平均值,只需要将合适的操作和数组变量融入到循环中即可。 2. EXIT语句 EXIT语句主要用于在循环体内提前终止循环。通常与IF语句结合使用,当满足特定条件时...

Global site tag (gtag.js) - Google Analytics