题目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
Source Code:
#include <iostream>
#define INF 0x7fffffff

using namespace std;

struct Stamp{
    int weight;
    int value;
};

int dp[110];
Stamp Arr[100000];

int minVal(int a,int b){
    return a<b?a:b;
}

int main()
{
    int n,m;
    while(cin>>n>>m){
        for(int i=1;i<=m;++i){
            cin>>Arr[i].weight;
            Arr[i].value=1;
        }
        dp[0]=0;
        for(int i=1;i<=n;++i)
            dp[i]=INF;
        for(int i=1;i<=m;++i){
            for(int j=n;j>=Arr[i].weight;--j){
                if(dp[j-Arr[i].weight]!=INF)
                    dp[j]=minVal(dp[j],dp[j-Arr[i].weight]+Arr[i].value);
            }
        }
        if(dp[n]==INF)
            cout<<0<<endl;
        else
            cout<<dp[n]<<endl;
    }
    return 0;
}

/**************************************************************
    Problem: 1209
    User: lcyvino
    Language: C++
    Result: Accepted
    Time:160 ms
    Memory:2300 kb
****************************************************************/
 
时间: 2024-10-22 15:54:53

题目1209:最小邮票数的相关文章

清华机试-最小邮票数

题目描述 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.     如,有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 解题思路

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

前言: 关于这种巧妙的排列组合类的算法问题,需要找到这种问题求解的特点,然后根据这种特点逐步求解的过程.在本问题中,要求解和一致情况下的组合数最小,这里我定义一个和sum长度一致的数组存放结果值,双重循环遍历完张数的总个数,在其中的第二层从sum值开始递减,逐渐找最小,最后输出数组中的结果位即可. 题目描述 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.     如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可. 输入描述:    

求三册邮票数

int a=1,b=1; while(a++) { b = a*4-303; if(a*5==a+b+303&&b>0&&(a*5)%7==0&&b%((a*5)/7)==0)//&&b%7==0&&b>0) { printf("总数 = %d\n a = %d\n b = %d\n c = %d",a*5,a,b,303); break; } }

P1021 邮票面值设计

P1021 邮票面值设计 题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到. 例如,N=3,K=2,如果面值分别为1分.4分,则在1分-6分之间的每一个邮资值都能得到(当然还有8分.9分和12分):如果面值分别为1分.3分,则在1分-7分之间的每一个邮资值都能得到.可以验证当N=3,K=2时,7分就是可以得到的连续的邮资最大值,所以MAX=7,面

洛谷 P2725 解题报告

P2725 邮票 Stamps 题目背景 给一组 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K -- 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 题目描述 例如,假设有 1 分和 3 分的邮票:你最多可以贴 5 张邮票.很容易贴出 1 到 5 分的邮资(用 1 分邮票贴就行了),接下来的邮资也不难: 6 = 3 + 3 7 = 3 + 3 + 1 8 = 3 + 3 + 1 + 1 9 = 3 + 3 + 3 10 = 3 + 3 + 3 + 1

UVa 242 Stamps and Envelope Size (无限背包,DP)

题意:信封上最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最 大,输出最大连续邮资和集合元素. 最大连续邮资是用S张以内邮票面值凑1,2,3...到n+1凑不出来了,最大连续邮资就是n.如果不止一个集合结果相 同,输出集合元素少的, 如果仍相同,输出最大面值小的. 析:这个题,紫书上写的不全,而且错了好几次,结果WA好几次. 首先这个和背包问题差不多,我们只用一维就好.dp[i]表示邮资为 i 时的最小邮票数,然后,如果dp[i] > s就该结束了. 其他的就很简

Harry Potter and the Forbidden Forest(割边最小的最小割)

Harry Potter and the Forbidden Forest Time Limit:3000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u Description Harry Potter notices some Death Eaters try to slip into Castle. The Death Eaters hide in the most depths of Forbidden Forest.

[SinGuLaRiTy] 动态规划题目复习

[SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metro 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲

最小的N个和 Codevs No.1245

2016-05-31 18:52:15 题目链接: 最小的N个和 Codevs No.1245 题目大意: 给两个等长数列,各取一个数求和,找到最小的N组 解法: 堆优化的大暴力 直接枚举所有可能在最大堆中更新,删除最大组合 需要注意的地方: 1.如果任何一个加数大于等于堆顶元素,break 2.如果两者之和已经大于等于堆顶元素,break 1 //最小的N个和 (Codevs No.1245) 2 //堆(优先队列) 3 #include<stdio.h> 4 #include<alg