Java M个自然数组合生成给定数(N)且重复的算法

Java M个自然数组合生成给定数(N)且重复的算法,java,algorithm,Java,Algorithm,我正在寻找一种算法,它可以打印出m个自然数的所有组合,这些组合产生一个给定的重复数(N) 假设我们的java函数是:public static String[]foo(6,3),其中6是N,3是M。 答案应该是: 0,0,6 0,1,5 0,2,4 0,3,3 1,1,4 1,2,3 2,2,2 and foo(7,4): 0,0,0,7 0,0,1,6 0,0,2,5 0,0,3,4 0,1,1,5 0,1,2,4 0,1,3,3 1,1,1,4 1,1,2,3 1,2,2,2 (if im

我正在寻找一种算法,它可以打印出m个自然数的所有组合,这些组合产生一个给定的重复数(N)

假设我们的java函数是:public static String[]foo(6,3),其中6是N,3是M。
答案应该是:

0,0,6
0,1,5
0,2,4
0,3,3
1,1,4
1,2,3
2,2,2

and foo(7,4):
0,0,0,7
0,0,1,6
0,0,2,5
0,0,3,4
0,1,1,5
0,1,2,4
0,1,3,3
1,1,1,4
1,1,2,3
1,2,2,2 (if im not wrong...)

提前谢谢你

最简单的方法是生成长度为M的数组和N以内的所有可能的数字组合,并测试每个数组的正确结果。
非常野蛮的武力,但会起作用。你可以从那里建立(消除双倍结果…)

你可能还想看看

这可能是这样的:

import java.util.LinkedList;

public class Tests 
{

    public static void main(String[] aargh)
    {
        LinkedList<int[]> arr = numarrays(7,4);
        for(int i = 0; i< arr.size();i++)
        {
            int[] curr = arr.get(i);
            for(int j = 0; j < curr.length;j++)
            {
                System.out.print(curr[j]+" ,"); 
            }
            System.out.println();
        }
    }

    public static LinkedList<int[]> numarrays(int result, int depth)
    {
        LinkedList<int[]> retVal = new LinkedList<int[]>();

        int[][] val = new int[1][];

        while(next(result,depth,val))
        {
            if(reject(result, val[0])) continue;
            if(!accept(result, val[0])) continue;   
            retVal.add(val[0].clone());
        }

        return retVal;
    }

    private static boolean reject(int max, int[] in) 
    {
        int sum = 0;
        for(int i = 0; i< in.length; i++)
        {
            sum += in[i];
            if(sum > max) return true;
        }

        return false;
    }

    private static boolean accept(int target, int[] in) 
    {
        int sum = 0;
        for(int i = 0; i< in.length; i++)
        {
            sum += in[i];
        }

        if(sum == target) return true;

        return false;
    }

    private static boolean next(int max, int depth, int[][] val) 
    {
        if(val[0] == null)
        {
            val[0] = new int[depth];
            return true;
        }

        return nextrec(max,val[0],0);
    }

    private static boolean nextrec(int max, int[] curr, int i) 
    {
        if(i>=curr.length) return false;

        if(nextrec(curr[i],curr,i+1)) return true;

        if(curr[i]< max)
        {
            curr[i]++;
            zerorec(curr,i+1);
            return true;
        }

        return false;
    }

    private static void zerorec(int[] curr, int i) 
    {
        if(i>=curr.length) return ;
        curr[i] = 0; 
        zerorec(curr,i+1);
    }
}
import java.util.LinkedList;
公开课考试
{
公共静态void main(字符串[]aargh)
{
LinkedList arr=Numarays(7,4);
对于(int i=0;i最大值)返回true;
}
返回false;
}
私有静态布尔接受(int目标,int[]in)
{
整数和=0;
for(int i=0;i=curr.length)返回false;
if(nextrec(curr[i],curr,i+1))返回true;
如果(当前[i]=当前长度)返回;
curr[i]=0;
zerorec(当前,i+1);
}
}

这里是一种递归方法,观察到您从对M个数字的要求开始,这可以分解为M-1数字的更简单问题,直到M=1

public class RecursiveCombinations {

    public static void main(String[] args) {
        solve(4,7,0,"");
    }

private static void solve(int M, int remainingValue, int previousLevel, String solutionSoFar) {
    if (M == 1) {
        System.out.println(solutionSoFar+remainingValue);
        return;
    }
    for (int i = previousLevel; i<=remainingValue/M; i++) {
        String s = solutionSoFar+i+",";
        solve(M-1, remainingValue-i, i, s);
    }
}

我相信你们要找的是配分函数。你们必须向我们展示你们的努力。这是规则。添加您尝试过的代码。
0,0,0,7
0,0,1,6
0,0,2,5
0,0,3,4
0,1,1,5
0,1,2,4
0,1,3,3
0,2,2,3
1,1,1,4
1,1,2,3
1,2,2,2