java版——完全背包
把购买完商品剩余的钱看作背包容量,把硬币看作物品硬币的面值看作物品重量物品的价值就是硬币数,本题要求最小硬币数,所以我们要让价值尽可能小。

public class Main{
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        int N = cin.nextInt();
        int n = 1024 - N;
        int[] dp = new int[n + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        int[] coin = {1, 4, 16, 64};
        for(int i = 0; i < coin.length; i++){
            for(int j = coin[i]; j <= n; j++){
                dp[j] = Math.min(dp[j], dp[j - coin[i]] + 1);
            }
        }
        System.out.println(dp[n]);
    }
}