[usaco3.1]邮票 Stamps

题目链接

思路分析:

dp[n]表示组成数字n最少需要多少张邮票

每读入一个x,我们就可以从x向2000000(最极限情况,即200张邮票和10000的面值)更新。

首先dp[n-x]必须<m 并且大于0,其次dp[n]必须>dp[n-x]+1(dp[n]=0除外),这样每次更新一次 dp[n]=dp[n-x]+1

最后从1遍历到2000000 如果中间出现断点就记录断点前一个数的值就可以了。

 1 #include <cstdio>
 2 int dp[2000005],m,n,ans;
 3 int main(){
 4     scanf("%d%d",&m,&n);
 5     for(register int i=1;i<=n;i++){
 6         int x; //register 是在寄存器里面运算 是为了加快速度
 7         scanf("%d",&x);
 8         dp[x] = 1;
 9         for(register int j=x+1;j<=2000000;j++){
10             if(dp[j-x] && dp[j-x]<m && (!dp[j] ||dp[j]>dp[j-x]+1)) dp[j] = dp[j-x]+1;
11         }
12     }
13     for(register int i=1;i<=2000000;i++){
14         if(dp[i]) ans=i;
15         else break;
16     }
17     printf("%d",ans);
18     return 0;
19 }

代码实现

时间: 2024-10-14 04:03:36

[usaco3.1]邮票 Stamps的相关文章

洛谷P2725 邮票 Stamps

P2725 邮票 Stamps 37通过 224提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 为什么RE?在codevs上AC的. 题目背景 给一组 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 题目描述 例如,假设有 1 分和 3 分的邮票:你最多可以贴 5 张邮票.很容易贴出 1 到 5 分的邮资(用 1 分邮票贴就行了),接下来的邮资也不难:

USACO 邮票 Stamps

f[x]表示组成 x 最少需要的邮票数量 一一举例 最多贴5张邮票,有三种邮票可用,分别是1分,3分,8分 组成0分需要0张邮票 --f[0]=0 组成1分需要在0分的基础上加上一张1分邮票 --f[1]= f[0]+1 =1 (单位:张) 组成2分需要在1分的基础上加上一张1分邮票 --f[2]= f[1]+1 =2 组成3分需要 min{在2分的基础上加上一张1分邮票,在0分的基础上加上一张3分邮票} --f[3]=min{ f[2]+1 , f[0]+1 } = min{ 3 , 1} =

洛谷 P2725 邮票 Stamps Label:DP

题目背景 给一组 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 11 = 3 + 3 + 3 +

P2725 邮票 Stamps

原题链接  https://www.luogu.com.cn/problem/P2725 题目大意 给你 m 个数,你可以从中任选不超过 n 个数(每个数可以重复选择),求最大的 k 使得 1~k 内的所有数都能被表示: 题解 70pts: 既然让求每个数能否被表示,那么我们可以顺着它的思路来设状态: dp [ i ][ k ]:用 j 个数能否表达 k: 考虑怎么转移: 我们枚举所有的数 a [ j ],如果说 i - a [ j ] 能用 k-1 个数来表达,那么我们再加上 a [ j ]

洛谷 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

usaco Stamps

问有K种邮票,限制所有邮票只能使用N个,问从1到X连续能拼出的总值时,x是多少. 好吧,题意叙述的有点不太清楚,原题比较好理解. 下面给代码,dp[i]表示凑成总值为i时,最少使用几张. 简单背包题目. /* ID: modengd1 PROG: stamps LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #define INF 2139062143 using names

uva 165 Stamps (回溯)

uva 165 Stamps The government of Nova Mareterrania requires that various legal documents have stamps attached to them so that the government can derive revenue from them. In terms of recent legislation, each class of document is limited in the number

【USACO 3.1.6】邮票

[描述] 已知一个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 11 = 3 + 3 + 3 + 1 + 1 12 = 3 + 3 + 3 + 3 13

【DFS】STAMPS

[Poj1010]STAMPS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18867   Accepted: 5469 Description Have you done any Philately lately? You have been hired by the Ruritanian Postal Service (RPS) to design their new postage software. The s