贪心算法——找纸币问题

 2023-09-13 阅读 20 评论 0

摘要:2019独角兽企业重金招聘Python工程师标准>>> 贪心算法——找纸币问题 问题主题:找钱 问题描述: 假设有1元、2元、5元、10元、20元、50元、100的纸币分别为c0,c1,c2,c3,c4,c5,c6,张。现在要用这些钱来支付K元,至少要用多少张纸币?如果能

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

贪心算法——找纸币问题

 

问题主题:找钱

问题描述:

假设有1元、2元、5元、10元、20元、50元、100的纸币分别为c0, c1, c2, c3, c4, c5, c6,张。现在要用这些钱来支付K元,至少要用多少张纸币?如果能找,则输出纸币的张数,不能找则输出No

限制条件:

0<=c0, c1,c2,c3,c4,c5,c6<=109

0<=K<=109

样例:

输入

C0=3, c1=0, c2=2, c3=1, c4=0, c5=3, c6=5

输出

6

 

 

【解法一】

解题分析:

    本题使用贪心算法,只需要考虑“尽可能多地使用面值大的纸币”,然后根据面值的大小从大到小排序依次选择。

程序实现:

 

C++

#include "iostream"

 

using namespace std;

 

const int N = 7;

static int K = 6200;

int min(int num1, int num2);

 

int momeyCount[N] = {3, 0, 2, 1, 0, 3, 5};

int value[N] = {1, 2, 5, 10, 20, 50, 100};

 

 

int giveChange() {

int num = 0;

for(int i = N-1; i >= 0; i --) {

int c = min(K/value[i], momeyCount[i]);

K = K - c * value[i];

num += c;

}

if(K > 0) 

num = -1;

return num;

}

 

int min(int num1, int num2) {

return num1 < num2 ? num1 : num2;

}

 

int main() {

int result = giveChange();

if(result != -1)

cout << result << endl;

else

cout << "NO" << endl;

return 0;

}

 

Java

package greed;import java.util.Arrays;/*** 找钱问题* User: luoweifu* Date: 14-1-14* Time: 下午8:08*/
public class GiveChange {public static int gaiveChange(MoneyBox[] moneyBoxes, int target) {Arrays.sort(moneyBoxes);int count = 0;for(int i = moneyBoxes.length-1; i >= 0; i--) {int currentCount = Math.min(moneyBoxes[i].getCount(), target/moneyBoxes[i].getValue());target -= currentCount*moneyBoxes[i].getValue();count += currentCount;}if(target > 0) {count = -1;}return count;}public static void main(String args[]) {MoneyBox[] moneyBoxes = {new MoneyBox(1, 3),new MoneyBox(2, 0),new MoneyBox(5, 2),new MoneyBox(10, 1),new MoneyBox(20, 0),new MoneyBox(50, 3),new MoneyBox(100, 5),};int result = gaiveChange(moneyBoxes, 620);if(result > 0)System.out.println(result);elseSystem.out.println("No");}
}/*** 钱盒子*/
class MoneyBox implements Comparable{private int value;private int count;MoneyBox(int value, int count) {this.value = value;this.count = count;}int getValue() {return value;}void setValue(int value) {this.value = value;}int getCount() {return count;}void setCount(int count) {this.count = count;}@Overridepublic int compareTo(Object o) {MoneyBox moneyBox = (MoneyBox)o;if(this.value < moneyBox.getValue())return -1;else if(this.value == moneyBox.getValue())return 0;elsereturn 1;}
}

 

算法复杂度:

    时间复杂度:如果纸币已经排序(如C++代码),O(n);如果纸币未经排序 (如Java代码),O(nlogn);

转载于:https://my.oschina.net/verynix/blog/365765

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/52192.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息