在0~N个数字中,取指定个数的不重复数字,要求这些数字的和为指定值,求所有结果

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5
  6 namespace ConsoleApp1 {
  7     class Program {
  8         static void Main(string[] args) {
  9
 10             // 防止出现随机值无法组合
 11             while (ResDic.Count == 0) {
 12
 13                 Con = 10;
 14                 // 初始化数组长度
 15                 int Len = 30;
 16                 Arr = new int[Len];
 17                 Temp = new int[Con];
 18
 19                 // 最小的数
 20                 int Min = (Con - 1) * Con / 2;
 21                 // 最大的数
 22                 int Max = (Len - Con + 1 + Len) * Con / 2;
 23                 // 获取范围内的一个随机数
 24                 Random random = new Random();
 25                 Sum = random.Next(Min, Max + 1);
 26
 27                 //
 28                 GetConNum(0, 0);
 29             }
 30
 31             Console.WriteLine(Sum);
 32             Console.WriteLine(ResDic.Count);
 33
 34             //for (int i = 0; i < ResDic.Count; i++) {
 35             //    Console.WriteLine(ResDic[i]);
 36             //}
 37
 38             Console.ReadLine();
 39         }
 40
 41         /// <summary>
 42         /// 用于存储所有结果
 43         /// </summary>
 44         private static Dictionary<int, string> ResDic = new Dictionary<int, string>();
 45         /// <summary>
 46         /// 用于取值
 47         /// </summary>
 48         private static int[] Arr;
 49         /// <summary>
 50         /// 用于存值
 51         /// </summary>
 52         private static int[] Temp;
 53         /// <summary>
 54         /// 要取的数字个数
 55         /// </summary>
 56         private static int Con;
 57         /// <summary>
 58         /// 总和
 59         /// </summary>
 60         private static int Sum;
 61
 62         /// <summary>
 63         /// 在Arr中取Con个不重复的数字
 64         /// </summary>
 65         /// <param name="index"></param>
 66         /// <param name="init"></param>
 67         private static void GetConNum(int index, int init) {
 68
 69             if (index >= Con) {
 70                 // 计算这些数字的和
 71                 int Tsum = 0;
 72                 for (int i = 0; i < Temp.Length; i++)
 73                     Tsum += Temp[i];
 74
 75                 // 若和与Sum相同,全排列存入所有排列可能
 76                 if (Tsum == Sum)
 77                     ListArray(0);
 78
 79                 return;
 80             }
 81
 82             for (int i = init; i < Arr.Length; i++) {
 83                 Temp[index] = i;
 84                 GetConNum(index + 1, i + 1);
 85             }
 86         }
 87
 88         /// <summary>
 89         /// 对数组Temp进行全排列
 90         /// </summary>
 91         /// <param name="index"></param>
 92         private static void ListArray(int index) {
 93             // 一次排列结束后
 94             if (index >= Temp.Length) {
 95                 // 取出当前的排列结果,拼成字符串
 96                 string str = "";
 97                 for (int i = 0; i < Temp.Length; i++) {
 98                     str += Temp[i];
 99                     if (i < Temp.Length - 1)
100                         str += ",";
101                 }
102                 // 将结果存入字典
103                 ResDic.Add(ResDic.Count, str);
104                 return;
105             }
106
107             int t = Temp[index];
108
109             // 交换位置
110             for (int i = index; i < Temp.Length; i++) {
111                 Temp[index] = Temp[i];
112                 Temp[i] = t;
113                 ListArray(index + 1);
114
115             // 还原
116                 Temp[i] = Temp[index];
117                 Temp[index] = t;
118
119             }
120         }
121     }
122 }
时间: 2024-10-10 09:50:19

在0~N个数字中,取指定个数的不重复数字,要求这些数字的和为指定值,求所有结果的相关文章

数字中所有数出现次数为k次,但有一个不为k次,求出这个数

思路: 1.建立辅助数组arr[32],统计数组中数的相应位上1的总和 2.如果要找的数在某个位i上不为0,则arr[i]对k取模肯定为0,否则表示要找的数在此位为1, s  +=  1<<i 代码如下: int find(int *a, int len, int K) { int arr[32] = {0}; int i, j; for(i = 0; i < len; ++i) { unsiged int k = a[i]; -->负数右移补1,会出错,所以先变成unsigned

排列组合问题:n个数中取k个数

/************************************有0~n-1共n个数,从其中任取k个数,*已知这k个数的和能被n整除,求这样的*k个数的组合的个数sum,*输入:n,k*输出:符合条件的个数sum************************************/ #include <malloc.h>#include <iostream>#include <stdio.h>using namespace std; int k, *a,

从数组中取3个数全排列

import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class comb { public static void main(String[] args) { //全排列 n from m //int c[]={3,94,100,8,5,7,12,6}; int c[]={3,94,100

在一个范围内随机生成指定个数的不重复随机数

public static void setRandom(int min, int max, int n, HashSet<Integer> set) { Random random = new Random(); for (int i = 0; i < n; i++) { int ranInt = random.nextInt(max - min + 1); if(!set.add(ranInt)){ i--; } } }

TODO:排列组合问题:n个数中取m个

排列组合是组合学最基本的概念.所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序.组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序.排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数. 排列组合与古典概率论关系密切. 本文示例实现的功能是"按顺序"从n个数中取m个数,如1,2,3,4,5,6取5个数字是:1,2,3,4,5:1,2,3,4,6:2,3,4,5,6.示例代码有javascript,php,golang,如果雷同,纯属学术研究,作为一种记

排列组合问题:n个数中取m个(Golang实现)

排列组合是一个基本的数学问题,本程序的目标是输出从n个元素中取m个的所有组合. 例如从[1,2,3]中取出2个数,一共有3中组合:[1,2],[1,3],[2,3].(组合不考虑顺序,即[1,2]和[2,1]属同一个组合) 本程序的思路(来自网上其他大神): (1)创建有n个元素数组,数组元素的值为1表示选中,为0则没选中. (2)初始化,将数组前m个元素置1,表示第一个组合为前m个数. (3)从左到右扫描数组元素值的"10"组合,找到第一个"10"组合后将其变为&

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

VB 6.0中判断是否Access 2010中存在指定表格

问题 最近在工作中遇到使用VB6判断是否ACCESS 2010数据库中是否存在指定表格的问题.对于早期ACCESS数据库(应当主要是ACCESS 2003及以前版本),使用DAO引擎操作是没有问题的.主要相关代码如下: For Each mytable In mydatabase.TableDefs    print mytable.nameNext 但是,DAO技术已经不适用于ACCESS 2010了.为此,我使用BAIDU搜索,初步得到的一个方法如下: cn2.Open "Provider=

python3.5中urllib模块抓取指定URL内容

python3.5中把python中的urllib和urllib2模块合并为urllib模块啦.urllib模块下有五个类: 抓取指定URL下内容封装成一个类文件对象,其中的很多方法操作和文件操作是一样的.