贪心法(经典例题篇)

思想:不断选取当前最优策略

区别:与上一篇所讲的动态规划有所不同,动态规划是指在多种策略下选取最优解,而贪心法只有一种策略。

例题一

硬币问题
 

Description

 

有1元、5元、10元、50元、100元、500元的硬币各C1、C5、C10、C50、C100、C500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?(题目一定有解。)

Input

 

输入包含多组测试用例,对于每组测试用例:

输入7个整数,前6个整数Ci分别代表6种硬币的个数,接着输入一个整数A(0 <= Ci<= 109,1 <= A <= 109)。

扫描二维码关注公众号,回复: 9383589 查看本文章

Output

 

输出最少需要多少枚硬币。

Sample Input 1

3 2 1 3 0 2 620

Sample Output 1

6

Hint

5元硬币2枚,10元硬币1枚,50元硬币2枚,500元硬币1枚。

思路:与之前的硬币问题(尽可能多的使用大面值的硬币)有所区别,之前的题目说的是每种硬币个数不限(当时的思路是将各个面值放入ku[ ], 循环遍历,每次操作就是 :硬币的个数 = 当前的钱 % 面值, 当前钱数 - = 兑换过的硬币数),而这次限制了硬币数量意味着兑换的硬币数要根据该面值的硬币本来的数量进行变化。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
int main(){
    int ku[6] = {1, 5, 10, 50, 100, 500};
    int num[6];
    while(cin >> num[0]){
        for(int i = 1; i < 6; i++){
            cin >> num[i];
        }
        int money;
        cin >> money;
        int cnt = 0;
        for(int i = 5; i >= 0; i--){
            int t = min(num[i], money / ku[i]);
            money -= t * ku[i];
            cnt += t;
        }
        cout << cnt << endl;
    }
    return 0;
}
View Code

例题二

区间问题

猜你喜欢

转载自www.cnblogs.com/nibaba131237/p/12359342.html
今日推荐