您的位置:首页 > 编程语言 > C语言/C++

C++动态规划 求换取指定数额钱币的最少货币数 普通动态规划和空间压缩方法

2017-08-28 13:58 253 查看
#include <iostream>

const int max = 65535;

int minCoins(int arr[], int aim, int length);

int minCoinsPro(int arr[], int aim, int length);

int main()

{
int arr[7] = { 5, 2, 5, 3, 4, 5, 7};
int aim = 31;
int length = std::end(arr) - std::begin(arr);

std::cout << minCoins(arr, aim, length) << std::endl;
std::cout << minCoinsPro(arr, aim, length) << std::endl;

system("pause");
return 0;

}

int minCoins(int arr[], int aim, int length)

{
if (arr == nullptr || aim < 0 || length < 0)
{
return -1;
}

int sum = 0;
int **pArr = new int*[length];
//动态生成二维数组
for (int i = 0; i < length; ++i)
{
pArr[i] = new int[aim + 1];
}

for (int i = 0; i < length; ++i)
//初始化第一列
{
pArr[i][0] = 0;
}
for (int i = 1; i < aim + 1; ++i)
//初始化第一行
{
pArr[0][i] = max;
}
if (aim >= arr[0])

{
pArr[0][arr[0]] = 1;
}

//for (int i = 1; i < length; ++i)
//构造dp数组
//{
// for (int j = 1; j < aim + 1; ++j)
// {
// if (j - arr[i] >= 0 && pArr[i - 1][j - arr[i]] != max)
// 数组左上角某个值存在
// {
// pArr[i][j] = pArr[i - 1][j] <= (pArr[i - 1][j - arr[i]] + 1) ? pArr[i - 1][j] : (pArr[i - 1][j - arr[i]] + 1);
// }
// else if (pArr[i - 1][j] != max)
//dp数组上一行同一列某个数存在
// pArr[i][j] = pArr[i - 1][j];
// else
// pArr[i][j] = max;
// }
//}
int left = 0;
for (int i = 1; i < length; ++i)
{
for (int j = 0; j < aim + 1; ++j)
{
left = max;
if (j - arr[i] >= 0 && pArr[i - 1][j - arr[i]] != max)
{
left = pArr[i - 1][j - arr[i]] + 1;
}
pArr[i][j] = left <= pArr[i - 1][j] ? left : pArr[i - 1][j];
}
}

sum = pArr[length - 1][aim] == max ? -1 : pArr[length - 1][aim];

for (int i = 0; i < length; ++i)
{
delete[] pArr[i];
}
delete[] pArr;

return sum;

}

int minCoinsPro(int arr[], int aim, int length)

{
if (arr == nullptr || aim < 0 || length < 0)
{
return -1;
}

int sum = 0;
int *pArr = new int[aim + 1];
pArr[0] = 0;
for (int i = 1; i < aim + 1; ++i)
{
pArr[i] = max;
}

if (aim >= arr[0])
{
pArr[arr[0]] = 1;
}

int left = 0;
for (int i = 1; i < length; ++i)
{
for (int j = aim; j >= 0; --j)
{
left = max;
if (j - arr[i] >= 0 && pArr[j - arr[i]] != max)
{
left = pArr[j - arr[i]] + 1;
}
pArr[j] = left < pArr[j] ? left : pArr[j];
}
}

sum = pArr[ai
4000
m] == max ? -1 : pArr[aim];
delete[] pArr;
return sum;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息