看到本题的标签是动态规划,就意味着最重要的是归纳出动态规划的关系式 设想一个dp数组,dp[1]表示组成1元需要的纸币,dp[10]表示组成10元需要的纸币,dp[100]表示组成100元需要的纸币 那么我们定义的时候vector dp(aim+1,max) 这里的max是最大方法,那么最大方法是多少呢,最不济的所有都是1元硬币,那么最多也就需要aim张,因此max>=aim+1 即可
- 首先,根据已给的硬币数组 初始化dp[arr[i]]=1
- 然后,遍历dp[money] 内部二次遍历硬币数组arr,关系表达式为 dp[i]=min(dp[i],dp[i-arr[j]]+1) dp[i]一开始可能是max 后来可能慢慢优化 从10 变为 8 再变为6等等 所以动态规划最重要的是获得关系式,以下是解析程序:
class Solution {
public:
/**
* 最少货币数
* @param arr int整型vector the array
* @param aim int整型 the target
* @return int整型
*/
int minMoney(vector<int>& arr, int aim) {
if(aim==0)
return 0;
// write code here
int max=aim+100;
vector<int> dp(aim+1,max);
int size=arr.size();
//初始化已有的硬币
for(int i=0;i<size;i++)
{
dp[arr[i]]=1;
}
for(int i=0;i<=aim;i++)
{
for(int j=0;j<size;j++)
{
if(i>=arr[j])
dp[i]=min(dp[i],dp[i-arr[j]]+1);
}
}
return dp[aim]>=max?-1:dp[aim];
}
};