当前位置: 首页 > 知识库问答 >
问题:

查找构成给定值的最小包数

马德厚
2023-03-14

我试图解决类似于这个问题,但有一些修改:

“给定一个值V,如果我们想换V美分,并且我们有无限量的C={C1,C2,…,Cm}值硬币,那么换硬币的最小数量是多少?”

输入:硬币[]={25,10,5},V=30

输出:至少需要2个硬币

我们可以用一枚25美分的硬币和一枚5美分的硬币

在我的例子中,我有一个对象数组,而不仅仅是一个数字数组。每件物品都有数量和价格。我想打印构成给定数量的最小数量的对象,然后打印价格,类似于:

2x59.95

1 x 35.95

我使用了此代码,但找不到如何完成任务:

public static void main(String[] args) {
        Product croissant = new Product("Croissant", "CF", null);

        Pack CF_1 = new Pack(3, 5.95);
        Pack CF_2 = new Pack(5, 9.95);
        Pack CF_3 = new Pack(9, 16.99);
        croissant.addPack(CF_1);
        croissant.addPack(CF_2);
        croissant.addPack(CF_3);

        System.out.println(minCoins(croissant, 13));
    }

    static int minCoins(Product product, int V) {
        // table[i] will be storing
        // the minimum number of coins
        // required for i value. So
        // table[V] will have result
        int table[] = new int[V + 1];

        // Base case (If given value V is 0)
        table[0] = 0;

        // Initialize all table values as Infinite
        for (int i = 1; i <= V; i++)
            table[i] = Integer.MAX_VALUE;

        // Compute minimum coins required for all
        // values from 1 to V
        for (int i = 1; i <= V; i++) {
            // Go through all coins smaller than i
            for (Pack pack : product.packList) {
                if (pack.qty <= i) {
                    int sub_res = table[i - pack.qty];
                    if (sub_res != Integer.MAX_VALUE
                            && sub_res + 1 < table[i])
                        table[i] = sub_res + 1;
                }
            }
        }
        return table[V];
    }

共有1个答案

殳自怡
2023-03-14

您可以获得构成最低硬币数量的包装清单,如下所示:

从给定的V开始,然后查找表中的值小于1的包,因为要达到V,您必须在1的某个地方具有较小的值。如果您找到了一个,请将其添加到列表中,并将下一个V减少您找到的包的数量,然后继续。

代码是:

   void printList(int[] table, Product product, int V) {
      List<Pack> list = new ArrayList<>();
      if ( table[V] == Integer.MAX_VALUE ) return list;
      while ( V > 0 ) {
        for (Pack pack : product.packList) {
          if ( V >= pack.qty && table[V-pack.qty] == table[V] - 1 ) {
            list.add(pack);
            V = V-pack.qty;
            break;
          }
        }
      }
    }

对于V=13的示例,列表将是:[{3,5.95},{5,9.95},{5,9.95}]这是假设您实现了Pack的toString()类作为;

public String toString() {
  return "{" + this.qty + "," + this.price + "}";
}

如果您想使用收集器

类似于:list。流()。收集(收集器.groupingBy(Pack::getQty))

 类似资料:
  • 在加权无向图中,我需要找到一个包含给定边“e”的最小生成树,如果可能的话。我该怎么做呢?Kruskal从“e”开始?

  • 所以,我有一个所有正自然数的数组。给我一个阈值。我必须找出总和小于给定阈值的数字(连续的)的最大计数。 输入数组的最大大小可以为 10^5。 基本上,我想到了一种算法,它计算原始数组的子集中元素的数量,这些元素的总和将小于给定的阈值。但是,这将导致O(N^2).的复杂性有人能建议一个更好的算法吗?我不是在寻找一个代码,只有一个算法/伪代码将做得很好。谢谢!

  • 本文向大家介绍JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例,包括了JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法。分享给大家供大家参考,具体如下: 运行结果: 感兴趣的朋友可以使用在线HTML/CS

  • 设T=(V,E)是一棵顶点和边的树,代价已知。我们想构造一个最小权完备图G=(V,E'),它的唯一最小生成树是T。 示例:考虑下面的树T,红色边具有给定的代价。将添加虚线边以从这棵树构造一个完整的图。 作为其唯一MST而跨越T的最小权完备图G如下所示: 2)对MST的所有其他边,权重,按权重递减的顺序重复。进行只包括而不包括其他MST边的切割。此切割的任何未知非MST边的权重应为。 问题: 1)上

  • 让一个整数的二进制搜索树创建一个包含所有小于给定整数x值的整数的链表。 我试过什么? 1)粗暴的解决方案(效率低下) BST 的顺序访问,我在列表中为每个整数 int the BST 插入一个节点,然后我从 x 开始释放列表中的每个节点 2)效率更高但错误 我进行了一次搜索,当我找到x时,我创建了一个列表,其中有序地访问了我找到x的节点的左边的子节点。 这显然是错误的,例如考虑到以下BST: 对于

  • 这是考试准备的一部分。我知道这和最大流量算法有关,但我很乐意给你一个提示: 设为无向连通图,为权函数,为边,。描述一种算法,该算法确定是否可以从图中最多删除边,以便属于新图的最小生成树。 我认为生成树是一种完美的匹配。但是,如何使它最小化,包含e和适当数量的其他边?