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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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 }

 

以上是关于在0~N个数字中,取指定个数的不重复数字,要求这些数字的和为指定值,求所有结果的主要内容,如果未能解决你的问题,请参考以下文章

JAVA怎么实现从指定范围随机取不重复的6个数字

去除重复数字

输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少

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

剑指offer09-数组中重复的数字

在指定数字范围内,随机获取n个不重复数字