换硬币

设有n种不同的硬币,各个硬币的面值存在数组w[i]中,现在要用这些硬币来找钱,可以使用各种面值的硬币的个数存于数组s[i]中,设计一个用最少硬币找钱的m的方法。

package 换硬币;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        //给出硬币的面值及个数
        int count =0;
        int w[] = new int[5];
        int s[] = new int[5];
        Scanner input = new Scanner(System.in);
        System.out.println("请输入n:");
        int n = input.nextInt();
        for(int i=0;i<n;i++)
        {
            System.out.println("输入面值:");
            w[i] = input.nextInt();
            System.out.println("输入数量:");
            s[i] = input.nextInt();

        }

        //把已经有的硬币按照从大到小的顺序存到a1中。
        List a1 = new ArrayList();
        for(int i=0;i<n;i++)
        {
            for(int j = 0;j<s[i];j++)
            {
                a1.add(w[i]+"");
            }
        }

        System.out.println("输入钱数:");
        int money = input.nextInt();

        //换钱
        //a2负责存储找的钱
        List a2 = new ArrayList();
        for(int i=0;i<a1.size();i++)//循环取钱
        {
            if(money >= Integer.parseInt((String)a1.get(i)))
            {
                a2.add(a1.get(i));//存入到换钱的数列中
                money = money- Integer.parseInt((String)a1.get(i));
                count++;
            }
        }

        //输出结果

        System.out.println("至少要用:"+count+"枚,用法如下:");
        int c[] = new int[n];
        for(int i=0;i<n;i++)//按照硬币种类统计使用的次数
        {
            c[i] = Collections.frequency(a2, w[i]+"");
            System.out.println("面值"+w[i]+":"+c[i]+"枚");
        }

    }

}
时间: 2024-10-03 14:45:00

换硬币的相关文章

找换硬币问题 与 0-1背包问题区别

之所以再写一篇Blog,是因为现实中很多问题都可以转化成“找换硬币”问题 和 “0-1”背包问题.因此,需要细细理解. 其次,在“参考资料”中汇总关于 贪心算法与动态规划的一些Blog及学习资料. 区别: 其实最大的区别就是:找换硬币问题中的 某类硬币 是可以多次选择的.而对于0-1背包问题,某物品要么选,要么不选,选了之后,它就“没了”.当然,有0-1背包问题的变形--完全背包问题--某(某类)物品有多个,可重复选. 第二,就是选择的权衡.0-1背包问题,还有个价值属性,在选择的时候,是考虑价

换硬币问题

[问题] 想兑换100元钱,有1,2,5,10四种钱,问总共有多少兑换方法. const int N = 100; int dimes[] = {1, 2, 5, 10}; int arr[N+1] = {1}; int coinExchange(int n) //动态规划 { int i, j; for (i = 0; i < sizeof(dimes)/sizeof(int); i++) { for (j = dimes[i]; j <= n; j++) arr[j] += arr[j-d

某种 找换硬币问题的贪心算法的正确性证明

一,问题介绍 最近一直在看贪心算法的正确性证明(如何证明贪心算法获得的解一定是最优解),感觉“剪枝”技巧用得比较多.再看了下<算法导论>中贪心算法一章里面的一个练习---找换硬币问题.这个问题对于某些 面值的硬币 是有最优解的,故记录下其中的一些证明思路. 考虑用最少的硬币数 来找 n 分钱的问题,假设每个硬币的值都是整数. 如果可换的硬币的单位是 c 的幂,也就是 c0,c1,... ,ck ,其中整数 c>1,k>=1 证明贪心算法总可以产生一个最优解. 二,找换硬币的贪心策略

PTA 7-1 换硬币 (20分)

将一笔零钱换成5分.2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法? 输入格式: 输入在一行中给出待换的零钱数额8. 输出格式: 要求按5分.2分和1分硬币的数量依次从大到小的顺序,输出各种换法.每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”.最后一行输出“count = 换法个数”. 输入样例: 13 输出样例: fen5:2, fen2:1, fen1:1, total:4 fen5:1, fen

习题4-5 换硬币 (20分)

将一笔零钱换成5分.2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法? 输入格式: 输入在一行中给出待换的零钱数额8. 输出格式: 要求按5分.2分和1分硬币的数量依次从大到小的顺序,输出各种换法.每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”.最后一行输出“count = 换法个数”. 输入样例: 13 输出样例: fen5:2, fen2:1, fen1:1, total:4 fen5:1, fen

【C语言入门】由“换硬币”题目引发的思考

[Pt.I]问题概述: 小明手中有硬币,小红手中有若干张10元的纸币.已知 1 角硬币厚 1.8mm,5 角硬币厚 1.5mm,1 元硬币厚 2.0mm .小红拿出若干张10元的纸币,小明要将 1 角的硬币放成一摞,将 5 角的硬币放成一摞,将 1 元的硬币放成一摞,如果 3 摞硬币一样高,且三摞硬币的金额之和正好等于小红要求的面值,则双方交换,否则没有办法交换. 输入: 小红希望交换几张10元的纸币 输出: 1 角的数量,5 角的数量,1元的数量 <错误程序> #include<std

Ada 换硬币小程序

with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure Main is type Coin is ( Penny, Nickel, Dime, Quarter, Half_Dollar, Dollar ); Coin_Value : constant array ( Penny .. Dollar ) of Integer := ( Penny => 1, Ni

硬币找零问题的动态规划实现

一,问题描述 给定一组硬币数,找出一组最少的硬币数,来找换零钱N. 比如,可用来找零的硬币为: 1.3.4   待找的钱数为 6.用两个面值为3的硬币找零,最少硬币数为2.而不是 4,1,1 因此,总结下该问题的特征:①硬币可重复多次使用.②在某些情况下,该问题可用贪心算法求解.具体可参考:某种 找换硬币问题的贪心算法的正确性证明 二,动态规划分析 为了更好的分析,先对该问题进行具体的定义:将用来找零的硬币的面值存储在一个数组中.如下: coinsValues[i] 表示第 i 枚硬币的面值.比

动态规划求解最多有几种方案求解硬币找零问题

一,问题描述 假设有 m 种面值不同的硬币,存储在 coinsValues数组中,现需要使用这些硬币来找钱,各种硬币的使用个数不限. 求对于给定的钱数N,我们最多有几种不同的找钱方式.硬币的顺序并不重要. 二,动态规划分析 为了更好的分析,先对该问题进行具体的定义:将用来找零的硬币的面值存储在一个数组中.如下: coinsValues[i] 表示第 i 枚硬币的面值.比如, 第 i 枚硬币     面值 1                1 2                3 3