#include <iostream>
const int jud = 65535; //32位 int型最大整数 用来进行数组的赋值
int minCoins(const int arr[], const int &length, const int &aim);
int minCoins_pro(const int arr[], const int &length, const int &aim);
int main()
{
int arr[10];
int aim = 0, n = 0, num = 0;
std::cout << "Input n length: ";
std::cin >> n;
std::cout << "Input aim: ";
std::cin >> aim;
for (int i = 0; i < n; ++i)
{
std::cin >> num;
arr[i] = num;
}
std::cout << minCoins_pro(arr, n, aim);
system("pause");
return 0;
}
int minCoins(const int arr[], const int &length, const int &aim)
{
if (aim == 0 || arr == nullptr)
{
return 0;
}
int minCoins = 0; //用来记录函数返回值,在函数返回之前需要将动态分配的内存释放
int **dp = new int *[length]; //动态申请一个dp[length][aim + 1]的数组
for (int i = 0; i < length; ++i)
{
dp[i] = new int[aim + 1];
}
for (int i = 0; i < length; ++i) //dp数组第一列全部赋值为0
{
dp[i][0] = 0;
}
for (int i = 1; i < aim + 1; ++i) //第一行数组将i的值为arr[0]的倍数的dp[0][i]递增存储,其他为jud
{
if (i - arr[0] >= 0 && dp[0][i - arr[0]] != jud)
{
dp[0][i] = dp[0][i - arr[0]] + 1;
}
else
dp[0][i] = jud;
}
int left = 0;
for (int i = 1; i < length; ++i)
{
for (int j = 1; j < aim + 1; ++j)
{
left = jud;
if (j - arr[i] >= 0 && dp[i][j - arr[i]] != jud)
{
left = dp[i][j - arr[i]] + 1;
}
dp[i][j] = left < dp[i - 1][j] ? left : dp[i - 1][j];
}
}
minCoins = dp[length - 1][aim];
for (int i = 0; i < length; ++i) //释放动态申请的数组
{
delete[] dp[i];
}
delete[] dp;
return minCoins == jud ? -1 : minCoins;
}
int minCoins_pro(const int arr[], const int &length, const int &aim)
{
if (arr == nullptr || aim == 0)
{
return 0;
}
int *pArr = new int[aim + 1];
int minCoins = 0;
int left = 0;
pArr[0] = 0;
for (int i = 1; i < aim + 1; ++i) //初始化数组
{
if (i - arr[0] >= 0 && pArr[i - arr[0]] != jud)
{
pArr[i] = pArr[i - arr[0]] + 1;
}
else
pArr[i] = jud;
}
for (int i = 1; i < length; ++i)
{
for (int j = 1; j < aim + 1; ++j)
{
left = jud;
if (j - arr[i] >= 0 && pArr[j - arr[i]] != jud)
{
left = pArr[j - arr[i]] + 1;
}
pArr[j] = left <= pArr[j] ? left : pArr[j];
}
}
minCoins = pArr[aim];
delete[] pArr;
return minCoins == jud ? -1 : minCoins;
}