【练习题】硬币组合
2015-08-09 16:29
357 查看
题目:
如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够指定金额?
函数:
/**
target : 给定的金额;
coins : 存放了所有硬币面额的vector,这里是{1,3,5};
**/
int getTheLeastCoinNum(int target,vector<int>& coins);
这道题一起是用贪心算法做的,今天换成动态规划试试。
好了,翠花,上代码:
结果:
如果我们有面值为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; }
结果:
相关文章推荐
- iOS中用模型取代字典的好处
- android 如何结束一个线程
- How to regress out unwanted vectors
- blade模板
- JavaScript学习笔记——DOM_对document对象的内容、属性、样式的操作
- GDB调试程序(四)
- LeetCode #2 Add Two Numbers
- git学习之旅(四)——回退版本
- 华为OJ(输出单链表倒数第K个节点)
- POJ 1995 Raising Modulo Numbers
- cocoapods
- white-space: nowrap;
- python 爬虫中文乱码问题
- GDB调试程序(三)
- Linux面试
- 大二层技术对比分析
- DNS挟持介绍
- win7 64位 鼠标右键explorer重启解决方法
- 【QQ机器人开发】茉莉QQ机器人3.X系列插件开发文档
- 2015 Multi-University Training Contest 1 hdu 5296 Annoying problem