我试图找到长度为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
订单并不重要。在此先感谢您的帮助。
答案 0 :(得分:3)
这是递归的典型案例。
对于f(0,0) - 总和为0的空字符串 - 有一个解决方案。对于f(0,N),其中N!= 0,没有解。这是基本情况。
对于一个3位数的字符串,总结为3,如您的示例所示,我们有:
或更一般地,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();
}
}