动态规划(完全背包):dp[i]表示兑换面值为i的钱币(装满容量为i的背包)所需要的最少货币数(物品数),第i个状态由上一状态,即放或者不放第j个物品推导而来,初始化dp为最大值,dp[0]=0.

class Solution {
public:
    /**
     * 最少货币数
     * @param arr int整型vector the array
     * @param aim int整型 the target
     * @return int整型
     */
    int minMoney(vector<int>& arr, int aim) {
        vector<int> dp(aim+1,999999);
        dp[0]=0;
        for(int j=0;j<arr.size();j++)
            for(int i=1;i<=aim;i++)
                if(i-arr[j]>=0)
                    dp[i]=min(dp[i],dp[i-arr[j]]+1);
        return dp[aim]==999999 ? -1: dp[aim];
    }
};