class Solution {
public:
    /**
     * 最少货币数
     * @param arr int整型vector the array
     * @param aim int整型 the target
     * @return int整型
     */
    /*
    dp(i),表示 i被arr表示出来最起码要几个硬币
    dp(i) = min(dp(i-arr[j]) + 1)
    */
    int minMoney(vector<int>& arr, int aim) {
        int len = arr.size();
        if (len == 0) { // 对arr进行输入判断
            return -1;
        }
        if (aim == 0) { // 对aim进行输入判断
            return 0;
        }

        vector<int>dp(aim + 1, INT_MAX);
        dp[0] = 0; //0 没有意义,初始化为0
        for (int i = 0; i <= aim; i++) {
            for (int j = 0; j < len; j++) {
                if (i >= arr[j]) {
                    dp[i] = min(dp[i-arr[j]] + 1, dp[i]);
                }
            }
        }
        return dp[aim] == INT_MAX ? - 1 : dp[aim];
        // write code here
    }
};