private static Iterable<Integer> findCoins1(int money, int[] changes) {
		Arrays.sort(changes);;
		int n = changes.length;
		
		int[] c = changes;
		for(int i = 0, j = n - 1; i < j; i++, j--) {
//			c[changes.length - 1 - i] = changes[i];
			int tmp = c[i];
			c[i] = c[j];
			c[j] = tmp;
		}

//		int[][] f = new int[n + 1][money + 1];
		int[] f = new int[money + 1];
		boolean[][] selected = new boolean[n + 1][money + 1];
		
		for(int i = 1; i <= n; i++) {
			int ci = c[i - 1];
//			for(int j = 1; j <= money; j++) {
//				if(j >= ci) {
//					if(f[i - 1][j] <= f[i - 1][j - ci] + ci) {
//						f[i][j] = f[i - 1][j - ci] + ci;
//						selected[i][j] = true;
//					} else {
//						f[i][j] = f[i - 1][j];
//						selected[i][j] = false;
//					}
//				} else {
//					f[i][j] = f[i - 1][j];
//					selected[i][j] = false;
//				}
//			}
			
			for(int j = money; j >= ci; j--) {
				if(f[j] <= f[j - ci] + ci) {
					f[j] = f[j - ci] + ci;
					selected[i][j] = true;
				} 
			}
//			for(int j = money; j >= 1; j--) {
//				if(j >= ci) {
//					if(f[j] < f[j - ci] + ci) {
//						f[j] = f[j - ci] + ci;
//						selected[i][j] = true;
//					} 
//				}
//			}
		}
		
		if(f[money] != money) {
			return null;
		} else {
			List<Integer> coins = new ArrayList<>();
			int tmp = money;
			int nx = n;
			while(tmp > 0) {
				if(selected[nx][tmp]) {
					coins.add(c[nx - 1]);
					tmp -= c[nx - 1];
				}
				nx -= 1;
			}
			
			return coins;
		}
	}