动态规划:
dp[i]
表示指定金额为i时的最少硬币数,array[n]为硬币面额。
状态方程为:
dp[i]=min⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪dp[i−array[1]]+1...dp[i−array[k]+1]...dp[i−array[n]+1]
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <utility>
#include <set>>
using namespace std;
int func(vector<int>&vec, int amount)
{
vector<int> dp;
dp.resize(amount+1,99999);
for (auto i = 0; i < vec.size();++i)
{
dp[vec[i]] = 1;
}
for (auto i = 0; i < amount + 1;++i)
{
for (auto j = 0; j < vec.size();++j)
{
if (i + vec[j] <= amount)
{
dp[i + vec[j]] = min(dp[i + vec[j]], dp[i] + 1);
}
}
}
if (dp[amount]==99999)
{
return -1;
}
return dp[amount];
}
int main() {
int amount(11);
vector<int> vec;
int array[3]{1, 2, 5};
vec.insert(vec.begin(), array, array + 3);
cout<<func(vec, amount);
return 0;
}