`
niunan
  • 浏览: 719003 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

在一堆数中查询相加得某个数的组合

    博客分类:
  • .NET
 
阅读更多

如题,一个网友问的,我又去问其他的网友,再网上搜索,发贴问,最后终于解决,不过目前还没有明白为什么要这样写,以下是代码:

  1.   class Program  
  2.     {  
  3.         static void Main(string[] args)  
  4.         {  
  5.             double[] numbers = new double[] { 258.5, 1229.1, 39.6, 660.3, 660, 660, 165, 165, 3060, 270, 4.8, 440, 279.06, 47.89, 38.02, 600, 286, 63.36, 1530, 1320, 1344, 3954 };  
  6.   
  7.   
  8.   
  9.   
  10.             Console.WriteLine("原数列:258.5,1229.1,39.6,660.3,660,660,165,165,3060,270,4.8,440,279.06,47.89,38.02,600,286,63.36,1530,1320,1344,3954\n\n");  
  11.   
  12.   
  13.              SumFinder.FindSum(numbers, 7785.52);  
  14.             // SumFinder.FindSum(new double[]{1,2,2,3,5}, 10);  
  15.   
  16.   
  17.         }  
  18.     }  
  19.   
  20.   
  21.   
  22.   
  23.     static class SumFinder  
  24.     {  
  25.         public static void FindSum(double[] numbers, double targetSum)  
  26.         {  
  27.             int elementCount = numbers.Length;  
  28.             int lastCombination = 2 << elementCount - 1;  
  29.             int firstCombination = 1;  
  30.             double sum;  
  31.             for (int i = firstCombination; i <= lastCombination; i++)  
  32.             {  
  33.                 sum = 0;  
  34.                 for (int pos = 0; pos < elementCount; pos++)  
  35.                 {  
  36.                     if ((i & (1 << pos)) != 0) //当前组合第pos个数是否取中  
  37.                         sum += numbers[pos];  
  38.                 }  
  39.                 if (sum == targetSum)  
  40.                 {  
  41.                     string str = "";  
  42.                     for (int pos = 0; pos < elementCount; pos++)  
  43.                     {  
  44.                         if ((i & (1 << pos)) != 0)  
  45.                         {  
  46.                            str += numbers[pos]+" + ";  
  47.                         }  
  48.                     }  
  49.                     Console.Write(str.Substring(0,str.Length-3)+" = " + targetSum);  
  50.                     Console.WriteLine();  
  51.                 }  
  52.             }  
  53.             Console.WriteLine("结束");  
  54.             Console.ReadLine();  
  55.         }  
  56.     }  
分享到:
评论
1 楼 han_yankun2009 2013-05-12  
,楠老师不错呀

相关推荐

    规划求解——从一堆数据求指定和值的组合

    从一堆数据中,要求出一个指定和值的组合,在财务审计中时常遇到这个头痛的问题,EXCEL中可以通过VBA的宏命令,快速解决这个头痛的问题。本文件,简单易学,上手快速,操作便宜,很值得推荐使用。

    java组合的算法

    在Java编程中,组合(Composition)是一种设计模式,它允许我们把对象组织成树状层次结构,这样子对象可以被视为单个单元。这种模式强调"部分-整体"的关系,是面向对象设计的基本原则之一。本篇文章将深入探讨Java中...

    查找数组中和为某个值的元素对的个数

    在编程领域,"2-sum"问题是一个常见的算法挑战,它涉及到在给定的整数数组中寻找两个元素,使得它们的和等于一个特定的目标值。这个问题对于理解和掌握基础的算法设计以及数据结构优化至关重要,特别是在面试和编程...

    找出哪几个数值的和接近目标值

    给定一个数值数组 `nums` 和一个目标值 `target`,我们需要找到数组中所有可能的子集,计算它们的和,并找出和最接近 `target` 的组合。这个问题可以使用回溯算法或动态规划来解决,但在这个案例中,由于标签提到了 ...

    一年级数学上册7分与合知识清单素材苏教版

    在一年级数学的学习中,"7的分与合"是一个重要的基础知识,主要涉及到的是数的分解与组合,这是儿童建立数感、理解数的结构的重要环节。苏教版教材中的这一部分设计,旨在帮助孩子们通过实际操作和游戏活动,掌握7的...

    ACM编程题模板和各种经典算法数据结构实现代码

    - C++ STL中的优先队列是一种基于堆的数据结构,用于实现优先级队列。 21. **堆栈** - 堆栈是一种只允许在一端进行插入和删除操作的线性表。 22. **区间最大频率** - 区间最大频率问题是指在一个区间内出现...

    七年级上数学期末复习总结.doc

    4. 棋子数量的转换问题:当从第一堆移动 3 颗棋子到第二堆后,第二堆棋子数是第一堆的 3 倍,可以通过建立方程解决这个问题,设第一堆原有 x 颗棋子,第二堆原有 y 颗棋子。 5. 同类项的理解:同类项是指字母相同,...

    ACM算法整合

    - 一种博弈论问题,涉及轮流从一堆石子中取走一定数量的石子。 - **集合划分问题** - 将一组元素划分为几个子集,使每个子集满足某些条件。 - **大数平方根(字符串数组表示)** - 计算大数的平方根。 - **大数...

    ACM模板(吉林大学)

    - 汉诺塔是一个经典的递归问题,涉及到如何将一堆圆盘从一个柱子移动到另一个柱子,且始终遵循较大的圆盘不能放在较小的圆盘之上的规则。 - **STL中的PRIORITY_QUEUE** - C++标准模板库(STL)中的优先队列是一种...

    经典面试题

    在Java中,对象存储在堆内存中,而变量(包括数组中的元素)存储在栈内存中。当一个变量引用了一个对象时,该对象的引用计数增加;当该变量不再引用这个对象时(例如变量值被改变或变量生命周期结束),对象的引用...

    世界500强面试题.pdf

    1.3.6. 在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b 52 1.3.7. n 个数字(0,1,…,n-1)形成一个圆圈 .................................................. 53 1.3.8. 定义 Fibonacci ...

    九年级数学上册期末模拟试题及答案精选.doc

    16. 频率的极限:在大量重复试验中,出现某个结果的频率趋向于其概率。 17. 解一元二次方程:涉及到了求解一元二次方程的方法,如因式分解法、配方法或者公式法。 18. 多项式的加法与因式分解:将多项式相加,然后...

    百度笔试题

    2. **计算位置:** 对于字符串 `s` 中的每个字符,计算其在序列中的位置,然后将这些位置相加即可得到 `s` 在序列中的位置。 #### 系统设计:相关性评分系统 **题目描述:** 设计一个评分系统,用于用户对搜索结果...

    刷题笔记1

    在题目中,如合并K个升序链表、找到数组中的第K个最大元素等,二叉堆能提供高效的解决方案。 7. **LRU缓存机制**:Least Recently Used,一种常见的页面替换算法,用于设计高效的数据结构。题目146要求实现LRU缓存...

    2011年考研计算机学科专业基础综合考试真题及答案详解

    偏移寻址是指通过将某个寄存器的内容与一个形式地址相加来生成有效地址。间接寻址则是通过访问一个地址来获取实际数据的位置,不属于偏移寻址的范畴。 ### 17. 条件转移指令的逻辑 第十七题探讨了条件转移指令的...

    汇编语言 指令大全 (详解版)

    在这个例子中,我们定义了两个变量`NUM1`和`NUM2`,并将它们相加后将结果存储回`NUM1`。最后通过中断指令输出结果并结束程序。 #### 总结 通过本文的介绍,我们可以了解到汇编语言中各种指令的基本用法以及如何...

    Java面试知识.doc

    - `assert`用于调试,确保代码中的某个条件始终为真。如果条件为假,系统将抛出`AssertionError`。断言在生产环境中通常关闭,但在开发阶段启用以帮助发现潜在问题。 以上只是Java面试中可能会遇到的部分知识点,...

    小学数学毕业试卷易错题集精选.doc

    第一个等式1-+=2,第二个是分数加减法的简便运算,需将分数通分后相加。 7. **平均数问题**:第6题(1)问甲乙两组平均每人作画数量。先计算甲乙两组总共作画数,即80+90=170张,然后除以总人数10,得出平均每人...

Global site tag (gtag.js) - Google Analytics