贪心算法学习感悟

  贪心算法就是遵循某种规则,不断选取当前最优策略的算法设计方法。

   2.2.1硬币问题

   要求:支付m元,现有给定面额为1,5,10,50,100,500这六种面额的硬币,各从C1,C2,C3,C4,C5,C6枚,求使用最少的硬币。

输入

620 3 2 1 3 0 2

输出

6

note:500元硬币一枚,50元硬币两枚,10元硬币一枚,5元硬币两枚,合计六枚

这是个贴近生活的简单问题。凭直觉可以做出以下解答:

  1. 首先尽可能多的使用500元硬币
  2. 剩余部分尽可能多的使用100元
  3. 硬币剩余部分尽可能多的使用50元硬币
  4. 剩余部分尽可能多的使用10元硬币
  5. 剩余部分尽可能多的使用5元硬币
  6. 最后剩余部分用1元硬币支付

      简而言之

      优先使用面值最大的硬币

       如果用贪心算法无疑是一个高效解法

       AC

        

#include <iostream>
#include <algorithm> 

using namespace std;

int a[7] = {0,1,5,10,50,100,500};
int b[7]; 
int main()
{
 	 int m;
 	 while(cin >> m)
 	 {
 	 	  int res = 0;
		  for(int i = 1;i<= 6;i++)
		  cin >> b[i];
		  for(int i = 6;i >= 1;i--)
		  {
		  	int t = min(m/a[i],b[i]);//algorithm函数,比较取最优
		  	m = m - t * a[i];//更新值
		  	res += t;
		   } 
		   cout << res <<endl;
	  }
 	 return 0;
}
   
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值