Problem:
整数の和

0 から 9 の数字から異なる n 個の数を取り出して合計が s となる組み合わせの数を出力するプログラムを作成してください。n 個の数はおのおの 0 から 9 までとし、１つの組み合わせに同じ数字は使えません。たとえば、n が 3 で s が 6 のとき、3 個の数字の合計が 6 になる組み合わせは、

1 + 2 + 3 = 6

0 + 1 + 5 = 6

0 + 2 + 4 = 6

の 3 通りとなります。

Input

複数のデータセットが与えられます。各データセットに n (1 ≤ n ≤ 9) と s (0 ≤ s ≤ 100) が１つのスペースで区切られて１行に与えられます。n と s が共に 0 のとき入力の最後とします（この場合は処理せずにプログラムを終了する）。

データセットの数は 50 を超えません。

Output

各データセットに対して、n 個の整数の和が s になる組み合わせの数を１行に出力して下さい。

Sample Input

3 6
3 1
0 0

Output for the Sample Input

3
0

Solution in JAVA (judge verdict: Accepted)



import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

public class Main {
    public static void main(String args[]){
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try{
            String line;
            
            while((line=br.readLine())!=null){
                if(line.equals(""))break;
                String[] splited = line.split(" ");
                int n = Integer.parseInt(splited[0]);
                s = Integer.parseInt(splited[1]);
                if(n==0&&s==0)break;if(n>=10)System.out.println("0");
                    combis(1,n);
                    System.out.println(count);
                count=0;
            }         
        }catch(Exception e){e.printStackTrace();}
        
    }
    static int[] com = new int[10];
    static int count = 0,s=0;
    static void combis(int st,int r){
        if(st<=r){
            for(int i=(st==1)? 0:com[st-1]+1;i<=9-r+st;i++){
                com[st]=i;
                combis(st+1,r);
            }
        }else{
            //System.out.println(Arrays.toString(com));
            int sum=0; for(int i=1;i<=r;i++) sum+=com[i];
            if(sum==s)count++;
        }
        
        }
    static int _10Cn(int n){
            int _n=1,d=1;
            for(int i=1; i<=n;i++){
                _n*=11-i; d*=i;
            }
            return _n/d;
        }
}