public class Main {
private static final int idim[]={13,26,24,19}; //题目给定的各个数的最大值
private static final int n=60; //所求的和
private static int isum[]=new int [idim.length-1]; //为打印各组合准备的数组
private static int is=0; //记录总共有多少种结果
private static final int or=1; //0,不打印各组合,只打印结果总数;1,打印各组合
public static void main(String args[]) {
int a=0;
for (int i = 0; i < idim.length; i++) {
a+=idim[i];
}
if (a<n) {
System.out.print("无解。");
System.exit(0);
}
f(1,n); //进行 A = x1+ A1。
//1 是标记x;n 表示 x+剩下的数的和
System.out.print(is);
}
public static void f( int x,int y ) {
if ( x==idim.length ) {
if (or==1) {
int a=0;
for (int i = 0; i < x-1; i++) {
a+=isum[i];
System.out.print(isum[i]+"\t");
}
System.out.print((n-a)+"\n");
}
is++;
} else {
int a=0;
for (int i = x; i < idim.length; i++) {
a+=idim[i];
}
int b=( (1+a)>y ) ? 1:(y-a);
int c=( idim[x-1]+1>y ) ? (y-1):idim[x-1];
for (int i = b; i < c+1; i++) {
isum[x-1]=i;
f(x+1,y-i);
}
}
}
}