【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 107071
  • 排名 - 231

最新评论

阅读排行榜

评论排行榜

已知一个 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 = 3 + 3 + 3 + 3 + 1。

然而,使用 5 枚 1 分或者 3 分的邮票根本不可能贴出 14 分的邮资。因此,对于这两种邮票的集合和上限 K=5,答案是 M=13。
[规模最大的一个点的时限是3s]

格式
PROGRAM NAME: stamps

INPUT FORMAT:
(file stamps.in)

第 1 行: 两个整数,K 和 N。K(1 <= K <= 200)是可用的邮票总数。N(1 <= N <= 50)是邮票面值的数量。

第 2 行 .. 文件末: N 个整数,每行 15 个,列出所有的 N 个邮票的面值,每张邮票的面值不超过 10000。

OUTPUT FORMAT:
(file stamps.out)

第 1 行:一个整数,从 1 分开始连续的可用集合中不多于 K 张邮票贴出的邮资数。

SAMPLE INPUT
5 2
1 3

SAMPLE OUTPUT
13

【参考程序】:

/*
ID: XIONGNA1
PROG: stamps
LANG: C++
*/
#include
<iostream>
using namespace std;
int p[201],f[2000002];
int k,n;
inline 
int MIN(int a,int b)
{
    
if (a>b) return b;
    
else return a;
}
int main()
{
    freopen(
"stamps.in","r",stdin);
    freopen(
"stamps.out","w",stdout);
    scanf(
"%d%d",&k,&n);
    
int maxv=0;
    
for (int i=1;i<=n;i++)
    {
        scanf(
"%d",&p[i]);
        
if (p[i]>maxv) maxv=p[i];
    }
    maxv
*=k;
    
for (int i=1;i<=maxv+1;i++) f[i]=0xFFFFFFF;
    f[
0]=0; f[maxv]=k;
    
for (int i=1;i<=n;i++)
        
for (int j=p[i];j<=maxv+1;j++)
            f[j]
=MIN(f[j],f[j-p[i]]+1);
    
for (int i=1;i<=maxv+1;i++)
        
if (f[i]>k)
        {
            printf(
"%d\n",i-1);
            
break;
        }
    
return 0;
}
posted on 2009-07-22 16:29 开拓者 阅读(160) 评论(0)  编辑 收藏 引用 所属分类: USACO 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理