算法练习之---最小邮票数

前言:

关于这种巧妙的排列组合类的算法问题,需要找到这种问题求解的特点,然后根据这种特点逐步求解的过程。在本问题中,要求解和一致情况下的组合数最小,这里我定义一个和sum长度一致的数组存放结果值,双重循环遍历完张数的总个数,在其中的第二层从sum值开始递减,逐渐找最小,最后输出数组中的结果位即可。

题目描述

有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。     如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。

输入描述:
    有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M<100。然后是一个数N,N〈20,表示有N张邮票。接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列。
输出描述:
      对于每组数据,能够凑成总值M的最少邮票张数。若无解,输出0。
输入例子:
1051 3 3 3 4
输出例子:
3
import java.util.Scanner;

public class 最小邮票数 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int sum=in.nextInt();
            int count = in.nextInt();
            int[] num=new int[count];
            for(int i=0;i<count;i++){
                num[i]=in.nextInt();
            }
            System.out.println(Mincount(num,count,sum));
        }
        in.close();

    }

    private static int Mincount(int[] num,int count,int sum){
        int[] dp = new int[sum + 1];
        for (int i = 1; i < dp.length; i++) {
            dp[i] = sum + 1;
        }
        for (int i = 0; i < count; i++) {
            for (int j = sum; j >= num[i]; j--) {
                dp[j] = Math.min(dp[j], dp[j - num[i]] + 1);
                //System.out.println(dp[j]+"   i="+i+"   "+"j="+j);
            }
        }
        if (dp[sum]==sum+1) {
            return 0;
        }
        return dp[sum];

    }

}
时间: 2024-10-08 00:26:12

算法练习之---最小邮票数的相关文章

清华机试-最小邮票数

题目描述 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.     如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可. 输入描述: 有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M<100.然后是一个数N,N〈 20,表示有N张邮票.接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列. 输出描述: 对于每组数据,能够凑成总值M的最少邮票张数.若无解,输出0. 示例1 输入 10 5 1 3 3 3 4 输出 3 解题思路

题目1209:最小邮票数

最小邮票数 题目描述: 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.    如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可. 输入: 有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M<100.然后是一个数N,N〈20,表示有N张邮票.接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列. 输出: 对于每组数据,能够凑成总值M的最少邮票张数.若无解,输出0. 样例输入: 10 5 1 3 3 3 4 样例输出: 3 S

HDUOJ--2121--Ice_cream’s world II【朱刘算法】不定根最小树形图

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题意:n个顶点,m条边,求从某一点起建立有向图最小生成树并且花费最小,输出最小花费和根节点下标. 思路:这道题根是不确定的,我们可以先假设一个根,从这个根出发到任何一点的距离(sum)都比原图总权值还大,这样保证了虚拟的边不会是最小入边,也为之后判断是否生成了最小树形图提供方便,从这个点开始建立最小树形图,最后生成出一个结果,很显然虚拟的根只有一条出边,并且出边连接的点就是真实的根. 最后得到的最

十大基础实用算法之寻找最小(最大)的k个数-线性查找算法

例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 思路1:最容易想到的方法:先对这个序列从小到大排序,然后输出前面的最小的k个数即可.如果选择快速排序法来进行排序,则时间复杂度:O(n*logn) 注:针对不同问题我们应该给出不同的思路,如果在应用中这个问题的规模不大,或者求解前k个元素的频率很高,或者k是不固定的.那么我们花费较多的时间对问题排序,在以后是使用中可以线性时间找到问题的解,总体来说,那么思路一的解法是最优的. 思路2:在思路1的基础上更进一步

【朱-刘算法】【最小树形图】hdu6141 I am your Father!

题意:给你一张带权有向图,让你求最大树形图.并在此前提下令n号结点父亲的编号最小. 比赛的时候套了个二分,TLE了. 实际上可以给每个边的权值乘1000,对于n号结点的父边,加上(999-父结点编号)大小的权值,这样即可保证最大树形图的前提下,n号结点父亲的编号最小. 网上找了个朱-刘算法的板子,把边权取负就能跑最大树形图了. #include <cstdio> #include <string> #include <cstring> #define MAXN 1005

朱、刘算法:求最小树形图权值个人理解+个人详解【最小树形图模板】

什么是最小树形图?相信大家如果会过来看这篇文章,想必也应该对最小生成树有所了解的,最小生成树求的是无向图的一颗生成树的最小权值.我们的最小树形图就是来解决一个有向图的一颗生成树的最小权值,对于度娘来说,最小树形图是这样定义的:最小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T,并且T中所有边的总权值最小. 通解最小树形图的一种算法是是1965年朱永津和刘振宏提出的复杂度为O(VE)的算法:朱.刘算法. 今天我们就来浅谈一下最小树形图的问题. 大题上完整的朱

利用Stoer-Wagner算法求无向图最小割

直接给出算法描述和过程实现: 算法步骤: 1. 设最小割cut=INF, 任选一个点s到集合A中, 定义W(A, p)为A中的所有点到A外一点p的权总和. 2. 对刚才选定的s, 更新W(A,p)(该值递增). 3. 选出A外一点p, 且W(A,p)最大的作为新的s, 若A!=G(V), 则继续2. 4. 把最后进入A的两点记为s和t, 用W(A,t)更新cut. 5. 新建顶点u, 边权w(u, v)=w(s, v)+w(t, v), 删除顶点s和t, 以及与它们相连的边. 6. 若|V|!=

力扣算法题—064最小路径之和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [   [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小. 1 #include "_000库函数.h" 2 3 //使用Dijkstra算法 4 //即动态规划 5 class Solution { 6 public: 7 int minPathSum(vec

普里姆算法(Prim)与最小生成树问题

普里姆算法 @anthor:QYX 普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类). 对于给定的连通网,起始状态全部顶点都归为 B 类.在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类:然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止.所走过的顶点和边就是该连通图的最小生成树. 例如,通过普里姆算法查找图 2(a)