Java 查找长度为x且和为s的所有置换

Java 查找长度为x且和为s的所有置换,java,permutation,Java,Permutation,我试图找到长度为n的排列数,其和为s。这就是我到目前为止所做的: StringBuilder sb = new StringBuilder(); for(int i=0; i<x+1; i++) { for(int j=s+1; j>0; j--) { sb.append(i); //sb.append(j); //sb.append(shares-i-j); }

我试图找到长度为n的排列数,其和为s。这就是我到目前为止所做的:

 StringBuilder sb = new StringBuilder();
    for(int i=0; i<x+1; i++) {
        for(int j=s+1; j>0; j--) {
            sb.append(i);
            //sb.append(j);
            //sb.append(shares-i-j);
        }
    }
    System.out.println(sb);

顺序不重要。提前感谢您的帮助。

这是递归的典型案例

对于f0,0-总和为0的空字符串-有一种解决方案。对于f0,N其中N!=0,则没有解决方案。这是基本情况

对于一个3位数的字符串,如您的示例所示,我们有:

以0开头的所有字符串,后跟两位字符串,总和为3 以1开头的所有字符串,后跟两位字符串,总和为2 等
或者更一般地说,fN,X是以数字0开头的字符串集我喜欢你的问题:-

这是我的解决办法

public class Test{
    public static void main(String[] args){

        int n = 3; //Number of cifers
        int m = 3; //The sum

        int[] arr = new int[n];

        for(int j = 0; j < (int) Math.pow(10,n)-1; j++){

            arr[0]++;

            for(int i = 0; i < arr.length; i++){
                if(arr[i] > 9){     
                    arr[i] = 0; 
                    arr[i+1]++;
                }
            }

        if(sum(arr) == m ) print(arr);

        }
    }

    public static int sum(int[] arr){
        int sum = 0;
        for(int i = 0; i < arr.length; i++){
            sum += arr[i];
        }
        return sum;
    }

    public static void print(int[] arr){
        for(int i = 0; i < arr.length; i++){
            System.out.print(arr[i]);
        }
        System.out.println();
    } 
}

如果长度是x,那么第一个循环应该是forint i=0;我要检查和是否是x,整数数组不是更合适吗?@Gumbo是,除了字符串。但是,总和是s,字符串用于构建输出。我添加了一个编辑,希望能提供一些澄清。请看上面。这会导致错误的答案。000000 00001 00100 0011 0110 012 10000 1001 1100 111 210 22对我来说,这个解决方案给出了正确的结果。我不知道发生了什么。现在可以了。非常感谢。
class Test {
    public static void main(String[] args) {
        f("", 3, 3);
    }
    static void f(String prefix, int length, int sum) {
        if (length == 0) {
            if(sum == 0) {
                System.out.println(prefix);
            }
        } else {
            for(int i=0; i<=sum && i<10; i++) {
                f(prefix + i, length-1, sum-i);
            }
        }
    }
}
public class Test{
    public static void main(String[] args){

        int n = 3; //Number of cifers
        int m = 3; //The sum

        int[] arr = new int[n];

        for(int j = 0; j < (int) Math.pow(10,n)-1; j++){

            arr[0]++;

            for(int i = 0; i < arr.length; i++){
                if(arr[i] > 9){     
                    arr[i] = 0; 
                    arr[i+1]++;
                }
            }

        if(sum(arr) == m ) print(arr);

        }
    }

    public static int sum(int[] arr){
        int sum = 0;
        for(int i = 0; i < arr.length; i++){
            sum += arr[i];
        }
        return sum;
    }

    public static void print(int[] arr){
        for(int i = 0; i < arr.length; i++){
            System.out.print(arr[i]);
        }
        System.out.println();
    } 
}