找到总和为x的所有长度x的排列

时间:2014-10-26 19:47:49

标签: 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);
        }
    }
    System.out.println(sb);

显然,这不能正常工作。如何更改代码以返回长度x总和为n的所有组合的字符串?所以最终,我需要一个字符串,为(3,3):003 030 300 102 120 111等读取这样的内容。我列出了所有可能的值,如下所示:

003
012
021
030
102
111
121
201
210
300

订单并不重要。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

这是递归的典型案例。

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

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

  • 所有字符串均以0开头,后跟两位数字符串,总计为3
  • 所有字符串以1开头,后跟两位数字符串,总计为2

或更一般地,f(N,X)是以数字0 <= D <= 9开始的字符串集合,接着是F(N-1,X-D)。

这是上述的简单,未经优化,非模块化的实现:

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);
            }
        }
    }
}

答案 1 :(得分:1)

我喜欢你的问题: - )

这是我的解决方案

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();
    } 
}