Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Algorithm 循环所有配置_Algorithm_Loops - Fatal编程技术网

Algorithm 循环所有配置

Algorithm 循环所有配置,algorithm,loops,Algorithm,Loops,我想不出一个好办法: 我想循环所有6个数字的组合,加起来是21。数字必须大于0和整数 例如: 21 0 0 0 0 0 20 1 0 0 0 0 20 0 1 0 0 0 ... 1 2 3 4 5 6 etc... 你们能给我一个线索吗?你们需要六个嵌套循环(或一个递归函数),一旦总和达到21,你们就应该打破循环。为第一个数字a选择一个数字,然后找出5个数字的组合加起来等于(21-a)的数量,依此类推,所有4个数字的组合等等。1个案例最多可以有1个组合。为了保持唯一性,可以

我想不出一个好办法:

我想循环所有6个数字的组合,加起来是21。数字必须大于0和整数

例如:

 21 0 0 0 0 0 
 20 1 0 0 0 0 
 20 0 1 0 0 0 
 ...
 1 2 3 4 5 6
 etc...

你们能给我一个线索吗?

你们需要六个嵌套循环(或一个递归函数),一旦总和达到21,你们就应该
打破循环。

为第一个数字a选择一个数字,然后找出5个数字的组合加起来等于(21-a)的数量,依此类推,所有4个数字的组合等等。1个案例最多可以有1个组合。为了保持唯一性,可以添加数字必须为非递增的约束

所以它会是这样的:

findcombinations(sum, length, max) {

if(length == 1)
  return 1;
else {
   for(int i = 0; i <= sum && i <= max; i++)
       return findcombinations(sum - i; length -1; i)
}
}
find组合(总和、长度、最大值){
如果(长度==1)
返回1;
否则{

对于(int i=0;i这个问题类似于下一个置换问题。我们可以通过修改如何获取下一个元素来解决这个问题。下面是一个示例代码

#include <iostream>

using namespace std;

bool findNext(int *perm)
{
    if (perm[5] == 21) 
        return false;
    int i;
    for(i = 0; i < 6; i++)
        if (perm[i] != 0)
            break;
    perm[i+1]++;
    perm[i]--;
    if (i > 0) {
        int tmp = perm[i];
        perm[i] = perm[0];
        perm[0] = tmp;                                                                                                                                                                                                                    
    }   
    return true;
}

void printPerm(int *perm)
{
    for (int i = 0; i < 6; i++) {
        cout << perm[i] << " ";
    }   
    cout << endl;
}

int main()
{
    int n[6];
    n[0] = 21; 
    for (int i =1; i < 6; i++)
        n[i] = 0;
    printPerm(n);
    while (findNext(n)) {
        printPerm(n);
    }   
    printPerm(n);

}
#包括
使用名称空间std;
bool findNext(int*perm)
{
if(perm[5]==21)
返回false;
int i;
对于(i=0;i<6;i++)
如果(perm[i]!=0)
打破
perm[i+1]++;
perm[i]-;
如果(i>0){
int tmp=perm[i];
perm[i]=perm[0];
perm[0]=tmp;
}   
返回true;
}
void printPerm(int*perm)
{
对于(int i=0;i<6;i++){

cout我更喜欢下一种排列方法。 或者您可以使用6个嵌套for循环的蛮力,这更易于实现

这是一个C#版本的下一个排列,由何承义的帖子转换而来

using System;
using System.Collections.Generic;
using System.Linq;

static class Extensions
{
    public static string GetString(this IEnumerable<int> arr)
    {
        return arr.Aggregate("", (a, b) => a + " " + b);
    }
}

class Program
{
    const int Sum = 21;
    const int Len = 6;

    static void Main(string[] args)
    {
        var result = new List<string>();
        Run(result);
        result.ForEach(Console.WriteLine);

        Console.WriteLine(string.Format("N: {0}\nPress a key to exit", 
            result.Count));
        Console.ReadKey();
    }

    static void Run(IList<string> result)
    {
        var n = new int[Len];
        n[0] = Sum;

        result.Add(n.GetString());
        while (FindNext(n))
        {
            result.Add(n.GetString());
        }
    }

    static bool FindNext(IList<int> perm)
    {
        if (perm.Last() == Sum)
        {
            return false;
        }

        int i;
        for (i = 0; i < Len; i++)
        {
            if (perm[i] != 0)
            {
                break;
            }
        }

        perm[i + 1]++;
        perm[i]--;
        if (i > 0)
        {
            int tmp = perm[i];
            perm[i] = perm[0];
            perm[0] = tmp;
        }
        return true;
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
静态类扩展
{
公共静态字符串GetString(此IEnumerable arr)
{
返回arr.Aggregate(“,(a,b)=>a+”+b);
}
}
班级计划
{
常数整数和=21;
常数int Len=6;
静态void Main(字符串[]参数)
{
var result=新列表();
运行(结果);
result.ForEach(Console.WriteLine);
Console.WriteLine(string.Format(“N:{0}\N按一个键退出”,
结果(计数);
Console.ReadKey();
}
静态无效运行(IList结果)
{
var n=新整数[Len];
n[0]=和;
添加(n.GetString());
while(FindNext(n))
{
添加(n.GetString());
}
}
静态布尔FindNext(IList perm)
{
if(perm.Last()=总和)
{
返回false;
}
int i;
对于(i=0;i0)
{
int tmp=perm[i];
perm[i]=perm[0];
perm[0]=tmp;
}
返回true;
}
}
蛮力版本在C中是这样的#

static void Main(字符串[]args)
{
var result=新列表();

对于(int a=0;a+1,但OP的示例表明他不需要唯一的集合。此外,return语句中的标点符号错误(至少对于我每天使用的任何语言)。[哦,如果你要生成唯一的集合,我会按升序而不是降序,这将
for
子句简化为一个比较:
for(int I=min;我是说随机选取一个合格的排列?你的示例代码输出(21,0,0,0,0,0),(0,21,0,0,0,0),(0,0,21,0,0,0),例如,是否有一种简单的方法只输出其中一个?
static void Main(string[] args)
{
    var result = new List<string>();
    for (int a = 0; a <= Sum; a++)
        for (int b = 0; b <= Sum; b++)
            for (int c = 0; c <= Sum; c++)
                for (int d = 0; d <= Sum; d++)
                    for (int e = 0; e <= Sum; e++)
                        for (int f = 0; f <= Sum; f++)                            
                            if(a+b+c+d+e+f==Sum)                                
                                result.Add(string.Format(
                                    "{0} {1} {2} {3} {4} {5}",
                                        a,b,c,d,e,f));

    result.ForEach(Console.WriteLine);                            
    Console.WriteLine(string.Format("N: {0}\nPress a key to exit",
                                    result.Count));
    Console.ReadKey();
}