Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找数字列表中的所有排列_C#_Algorithm - Fatal编程技术网

C# 查找数字列表中的所有排列

C# 查找数字列表中的所有排列,c#,algorithm,C#,Algorithm,目前我有一个13个值的数组,我想找到它的所有排列,排除那些总和超过给定阈值的排列。问题是,有太多的价值观,它永远不会结束。有没有办法优化我的产品 public class formPermut { public void swapTwoNumber(ref int a, ref int b) { int temp = a; a = b;

目前我有一个13个值的数组,我想找到它的所有排列,排除那些总和超过给定阈值的排列。问题是,有太多的价值观,它永远不会结束。有没有办法优化我的产品

 public class formPermut
        {
            public void swapTwoNumber(ref int a, ref int b)
            {
                int temp = a;
                a = b;
                b = temp;
            }
            public void prnPermut(int[] list, int k, int m)
            {
                int i;
                if (k == m)
                {
                    for (i = 0; i <= m; i++)
                        Console.Write("{0}", list[i]);
                    Console.Write(" ");
                }
                else
                    for (i = k; i <= m; i++)
                    {
                        swapTwoNumber(ref list[k], ref list[i]);
                        prnPermut(list, k + 1, m);
                        swapTwoNumber(ref list[k], ref list[i]);
                    }
            }
        }
        public static void RecExercise11()
        {
            int n, i;
            formPermut test = new formPermut();
            int[] arr1 = new int[13];

            Console.WriteLine("\n\n Recursion : Generate all possible permutations of an array :");
            Console.WriteLine("------------------------------------------------------------------");

            Console.Write(" Input the number of elements to store in the array [maximum 13 digits ] :");
            n = Convert.ToInt32(Console.ReadLine());
            Console.Write(" Input {0} number of elements in the array :\n", n);
            for (i = 0; i < n; i++)
            {
                Console.Write(" element - {0} : ", i);
                arr1[i] = Convert.ToInt32(Console.ReadLine());
            }

            Console.Write("\n The Permutations with a combination of {0} digits are : \n", n);
            test.prnPermut(arr1, 0, n - 1);
            Console.Write("\n\n");
        }
    }
}
公共类formPermut
{
公共无效SwaptwonNumber(参考内部a、参考内部b)
{
内部温度=a;
a=b;
b=温度;
}
公共无效prnPermut(int[]列表,int k,int m)
{
int i;
如果(k==m)
{

对于(i=0;i,问题在于,您需要排除总和大于阈值的置换是回溯的完美候选(暂时不要搜索此项),考虑一种加速的方法(有n个置换,因此它不会在一段时间内完成)

想象一下,这就像一棵树,树叶本身就是排列,答案是:

  • 你需要知道完整的排列才能排除它吗
  • 在非叶节点中可以进行哪些计算

我建议您从这里开始使用置换库


然后在上面写下你的筛选。

这是教授的家庭作业问题吗?如果是,他是否给出了程序应该能够处理的参数?可能是问题太大,无法处理那么多参数。我无法判断是算法太慢,还是问题太大,因为它不是ob这段代码的作用很明显。首先,重命名所有变量。给它们起个有意义的名字。一年左右以后,当你开始做程序员的第一份工作,并且不得不对你编写的旧代码做一些维护工作时,你会感谢我。这段代码会找到你输入的给定数字集的所有排列。The only parameters是一个整数列表和一个上限,该特定总和的总和不能超过,如果超过,则不需要包含。数组的总和在置换下是不变的。您没有精确或准确地说明您真正要解决的问题。请澄清问题。没有人能回答您的问题因为你根本没有解释你的问题。例如,组合和排列不是一回事,如果你不知道,也许你需要理解你的问题,这样你就可以向其他人解释。这是一个问题。我想解决的第一个问题是处理排列的列表。有没有办法解决它当我使用一个有13个索引的数组时,不需要花很长时间来完成列表。如果你的算法是正确的,那么你是否能够足够快地完成它就无关紧要了,因为你可能会被要求运行一个14位的数组,你会尝试对它进行优化,除了
Omega(n!)
(假设打印函数以某种方式需要恒定的时间,这显然不会),因为存在
n!
permutations,所以不应该尝试打印所有排列(除非整个数组小于总和).事实上,我认为你的问题没有正确表述:如果数组的和小于一个数字,你不应该打印任何排列