您的位置:首页 > 其它

【练习题】硬币组合

2015-08-09 16:29 357 查看
题目:
如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够指定金额?

函数:

/**

target : 给定的金额;

coins : 存放了所有硬币面额的vector,这里是{1,3,5};

**/

int getTheLeastCoinNum(int target,vector<int>& coins);

这道题一起是用贪心算法做的,今天换成动态规划试试。

好了,翠花,上代码:

#include<iostream>
#include<vector>
#include<ctime>

using namespace std;

class Solution {
public:
/*
如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
*/
int getTheLeastCoinNum(int target,vector<int>& coins)
{
int r;
//max_length,顾名思义,它表示一个极大值,至少比最大硬币需求还要大.
int max_length = coins.max_size();
//MIN是路径数组,MIN[i]表示:“凑齐金额 i ,需要的最少硬币数量”.
vector<int> MIN(target + 1, max_length);

//初始状态:凑齐金额0,我们一枚硬币都不需要。
MIN[0] = 0;

//金额从0到target开始累加
for (int i = 0; i <= target; i++)
{
//遍历提供的硬币面额
for (int j = 0; j < coins.size(); j++)
{
//这个过程我来举个栗子:
//第一次
//i==5:当前问题是“凑齐5元最少多少枚硬币”;
//coins[0]==3:考察面额为3的硬币;
//i-coins[0]==2:如果我们用了一枚3元的硬币,剩下2元。
//我们需要在MIN数组中取得凑齐2元硬币需要的最少面额(这个在之前的循环中已经求出)
//而MIN[2]==MIN[i - coins[0]]==2;
//所以,如果用了1枚3元的硬币,我们总共需要 (MIN[2]+1)==3 枚硬币凑齐5元;
//3<初始化时的极大值,所以MIN[i]=3;

//j++;

//第二次
//i==5;
//coins[1]==1;
//i-coins[1]==4:如果我们用了一枚1元的硬币,那么剩下4元。
//我们需要在MIN数组中取得凑齐4元硬币需要的最少面额(这个在之前的循环中已经求出)
//而MIN[2]==MIN[i - coins[1]]==2;求得的结果依然是需要3枚 == MIN[i];

//j++

//第三次
//i==5;
//coins[2]==5;
//i-coins[2]==0:如果我们用了一枚5元的硬币,那么剩下0元。
//我们需要在MIN数组中取得凑齐0元硬币需要的最少面额(这个在之前的循环中已经求出)
//而MIN[0]==MIN[i - coins[1]]==0;求得的结果是 MIN[0]+1 == 1 ,小于之前的 MIN[i]==3;
//所以MIN[i]=1;

if (i >= coins[j] && MIN[i - coins[j]] + 1 < MIN[i])
{
//cout << "金额" << i << ",当前面额:" << coins[j] << endl;
MIN[i] = MIN[i - coins[j]] + 1;
}
}
cout << "MIN[" << i << "]==" << MIN[i] << endl;
}
return MIN[target];
}
};

int main()
{

vector<int> nums{3,1,5};
Solution s;
clock_t start_time = clock();
{
s.getTheLeastCoinNum(11,nums);
cout << endl;
}
clock_t end_time = clock();
std::cout << "算法1耗时: " <<static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000<< "ms" << endl;//输出运行时间

return 0;
}


结果:

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