我猜想你是希望在输入完成的时候就动态输出结果;
(1)Scanner.nextInt() 这个方法在buff里面是读取并返回buffer的相对应的值后,指针会跳到下一个int; 所以在初始化的时候,第一次初始化input的时候数组的长度只会是buffer里面的第一个数字。

(2) 接下来的for loop里面给input[] 赋值我猜可能是给相对应的input[n]赋值给当前的输入? 然后再判断最大值在下面的dp里面初始化max+1的数字来做dp? 这一块的代码会导致在for loop里loop完nextInt()之后,后面的input[i]就会是null值,因为buffer里的int值已经读完了,所以会出现空指针(我没throw exception去具体测试)。比如说输入1200 1300 1400, 那么你的input的长度就是1200, 初始化之后会是input[0] = 1300, input[1] = 1400, input[2] = null ... 

然后我在你代码基础上做了一些修改,没有做结束输入的判断,终止while loop之后就会输出结果:

import java.util.ArrayList; import java.util.Scanner;  public class NewCoder_WeChat1 { public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  int[] mon = {1, 2, 5, 10, 20, 50, 100};  ArrayList outcomes = new ArrayList();  int sum = 0;   while (sc.hasNext()) { int n = sc.nextInt();  System.out.println(sc);  int[] dp = new int[n + 1];  dp[0] = 0;   for (int i = 0; i < mon.length; i++) { for (int j = mon[i]; j <= n; j++) {
                    dp[j] = dp[j - mon[i]] + 1;  }
            }
            outcomes.add(dp[n]);  } for (Object out : outcomes) {
            sum += out.hashCode();  }

        System.out.println("sum is:" + sum);  }
}