硬币问题(贪心)
2015-10-20 13:54
288 查看
有1元,5元,10元,50元,100元,500元的硬币各A1,A5,A10,A50,A100,A500枚,现在要用这些硬币支付money元,最少需要支付多少硬币?假定本题至少一种支付方案。
分析:
要使数量最少,所以要先从面值大的开始选择,依次往下类推,即可得到最佳答案。
优先选择面值大的。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<queue>
#define L(i,n,m) for(int i = n;i >= 0;i --)
#define M(i,n,m) for(int i = n;i < m;i ++)
#define N(n,m) memset(n,m,sizeof(n));
const int V[6] = {1,5,10,50,100,500}; ///面值
using namespace std;
int main()
{
int a[6],money,sum; ///数组a为所有面值的数量有多少
while(cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>money)
{
sum = 0;
L(i,5,0)
{
int t = min(money/V[i],a[i]); ///找出使用面值V[i]的数量
money -= t * V[i]; ///总钱数减少
sum += t; ///数量增加
}
printf("%d\n",sum); ///输出
}
return 0;
}
分析:
要使数量最少,所以要先从面值大的开始选择,依次往下类推,即可得到最佳答案。
优先选择面值大的。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<queue>
#define L(i,n,m) for(int i = n;i >= 0;i --)
#define M(i,n,m) for(int i = n;i < m;i ++)
#define N(n,m) memset(n,m,sizeof(n));
const int V[6] = {1,5,10,50,100,500}; ///面值
using namespace std;
int main()
{
int a[6],money,sum; ///数组a为所有面值的数量有多少
while(cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>money)
{
sum = 0;
L(i,5,0)
{
int t = min(money/V[i],a[i]); ///找出使用面值V[i]的数量
money -= t * V[i]; ///总钱数减少
sum += t; ///数量增加
}
printf("%d\n",sum); ///输出
}
return 0;
}
相关文章推荐
- GRUB- "No suitable mode found"
- handsontable-chosen-editor
- JS日期时间类型(Y-m-d H:i:s)与时间戳互转
- Request的getParameter和getAttribute方法的区别
- 如何修改MFC的图标
- MDK Executing a function or an interrupt handler in RAM
- Window窗口布局 --- DecorView浅析
- 你应该知道的 RPC 原理
- 网址
- 接口类与抽象类的区别
- nmon的使用
- zookeeper原理(转)
- 简单的分析网易热这款产品
- Exchange 2013如何自建管理员角色
- 在ListView下面添加一个相对布局的小Dome-布局优化
- Hibernate 缓存机制
- 主线程在所有子线程结束后 在继续执行
- Toolbar中menu菜单文字颜色的修改
- 将已有的Android从Eclipse手动迁移到Android Studio(不用gradle)
- iossharesdk微信登录出错