import java.util.*;
import java.lang.*;
import java.io.*;
class Solution{
System.
out.
println(getChange
(new int[]{1,
6,
9},
30)); System.
out.
println(getChange
(new int[]{1},
3)); System.
out.
println(getChange
(new int[]{4,
20,
500},
450)); }
private static List<Integer> getChange(int[] denominations,int amount){
List<Integer> ans = new ArrayList<>();
if(amount <= 0 || denominations[0] > amount) return ans;
int[][] dp = new int[amount + 1][2];
for(int i=0;i<denominations.length;++i){
if(denominations[i] > amount) break;
dp[denominations[i]][0] = 1;
dp[denominations[i]][1] = 0;
for(int j=denominations[i] + 1;j<=amount;++j){
if(dp[j-denominations[i]][0] > 0 && (dp[j][0] == 0 || dp[j-denominations[i]][0] + 1 < dp[j][0])){
dp[j][0] = dp[j-denominations[i]][0] + 1;
dp[j][1] = j-denominations[i];
}
}
}
if(dp[amount][0] > 0){
while(dp[amount][0] != 0){
ans.add(amount - dp[amount][1]);
amount = dp[amount][1];
}
}
return ans;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBTb2x1dGlvbnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldENoYW5nZShuZXcgaW50W117MSw2LDl9LDMwKSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDaGFuZ2UobmV3IGludFtdezF9LDMpKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldENoYW5nZShuZXcgaW50W117NCwyMCw1MDB9LDQ1MCkpOwoJfQoJCglwcml2YXRlIHN0YXRpYyBMaXN0PEludGVnZXI+IGdldENoYW5nZShpbnRbXSBkZW5vbWluYXRpb25zLGludCBhbW91bnQpewogICAgICAgICAgICBBcnJheXMuc29ydChkZW5vbWluYXRpb25zKTsKICAgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBhbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgaWYoYW1vdW50IDw9IDAgfHwgZGVub21pbmF0aW9uc1swXSA+IGFtb3VudCkgcmV0dXJuIGFuczsKICAgICAgICAgICAgaW50W11bXSBkcCA9IG5ldyBpbnRbYW1vdW50ICsgMV1bMl07CgogICAgICAgICAgICBmb3IoaW50IGk9MDtpPGRlbm9taW5hdGlvbnMubGVuZ3RoOysraSl7CiAgICAgICAgICAgICAgICBpZihkZW5vbWluYXRpb25zW2ldID4gYW1vdW50KSBicmVhazsKICAgICAgICAgICAgICAgIGRwW2Rlbm9taW5hdGlvbnNbaV1dWzBdID0gMTsKICAgICAgICAgICAgICAgIGRwW2Rlbm9taW5hdGlvbnNbaV1dWzFdID0gMDsKICAgICAgICAgICAgICAgIGZvcihpbnQgaj1kZW5vbWluYXRpb25zW2ldICsgMTtqPD1hbW91bnQ7KytqKXsKICAgICAgICAgICAgICAgICAgICBpZihkcFtqLWRlbm9taW5hdGlvbnNbaV1dWzBdID4gMCAmJiAoZHBbal1bMF0gPT0gMCB8fCBkcFtqLWRlbm9taW5hdGlvbnNbaV1dWzBdICsgMSA8IGRwW2pdWzBdKSl7CiAgICAgICAgICAgICAgICAgICAgICAgZHBbal1bMF0gPSBkcFtqLWRlbm9taW5hdGlvbnNbaV1dWzBdICsgMTsKICAgICAgICAgICAgICAgICAgICAgICBkcFtqXVsxXSA9IGotZGVub21pbmF0aW9uc1tpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGRwW2Ftb3VudF1bMF0gPiAwKXsKICAgICAgICAgICAgICAgIHdoaWxlKGRwW2Ftb3VudF1bMF0gIT0gMCl7CiAgICAgICAgICAgICAgICAgICAgYW5zLmFkZChhbW91bnQgLSBkcFthbW91bnRdWzFdKTsKICAgICAgICAgICAgICAgICAgICBhbW91bnQgPSBkcFthbW91bnRdWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKCiAgICAgICAgICAgIHJldHVybiBhbnM7Cgl9Cn0=