UVa 165 - Stamps

36 篇文章 0 订阅

这个题题目大意就比较难理解。题意:给定 h(贴邮票位置数),k(允许使用的邮票面值数) (h+k<=9)  求n(h,k) (即用k种面值的邮票在最大h个位置拼成连续面值的最大值) 。

样例:h=3 k=2。若两种面值为1,3  则可以拼出 1,2,3,4,5 ,6 ,7 ,9 连续的最大和只到7。

因此输出:

  1  3 ->  7
思路:数据量不大,可以一个一个数的往后推,首先,面值为1的邮票是必须选的,否则起码面值和“1”就凑不出来了。从1着手,其下一个数的取值范围必定在当前面值凑出数的(最小值+1)与(最大值+1)之间,比如:h为3,k为3,当前为1 3,则下一个数的范围为:4~8之间,下一个数的取值小了重复,而大了,则必定会出现断点,比如上例中如果下一个数是9,因为8必然凑不出来,所以9就是无效数据。以此回溯枚举所有位置面值的和,再判定连续的最大值便是所求的结果。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>

using namespace std;
int kval[11], save[11];
bool visit[190]; // 180时还RE,貌似最大面值和能达到180+
int h, k, _max;

void check(int n, int cur, int sum) // 将当前所具有的面值 和的所有情况都枚举出来并利用visit数组进行标记
{
    if(cur == h)
    {
        visit[sum] = true;
        return ;
    }
    visit[sum] = true;
    for(int i=0; i <= n; i++)
        check(n, cur+1, sum+kval[i]);
}
void dfs(int cur, int num) // 依次往下推导下一个面值
{
    if(cur > k)
    {
        if(num-1 > _max)
        {
            _max = num-1;
            memcpy(save, kval, sizeof(kval));
        }
        return ;
    }
    for(int i=kval[cur-1]+1; i<=num; i++)
    {
        kval[cur] = i;
        memset(visit, false, sizeof(visit));
        check(cur, 0, 0);
        int j = kval[cur-1];//从上一层的面值和的数开始判断,直到遇到第一个false跳出
        while(visit[++j])
            ;
        dfs(cur+1, j);
    }
}
int main()
{
#ifdef test
    freopen("sample.txt", "r", stdin);
#endif
    kval[0] = 0;
    kval[1] = 1;
    while(scanf("%d%d", &h, &k))
    {
        if(!h && !k)
            break;
        _max = 0;
        dfs(2, h+1);
        for(int i=1; i<=k; i++)
            printf("%3d", save[i]);
        printf(" ->");
        printf("%3d\n", _max);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stamps 4.1 是一个邮票收集和管理软件,它提供了方便的方式来记录和管理邮票收藏。 使用stamps 4.1,用户可以创建一个个人邮票收藏库,将自己的邮票收藏组织起来。它提供了一个直观易用的界面,让用户可以轻松添加、编辑和删除邮票记录。用户可以为每张邮票输入的详细信息,如邮票的国家、年份、面值、设计和特点等,以便更好地了解每张邮票的背景和重要性。 除了记录邮票的基本信息,stamps 4.1 还提供了一些高级功能,以便用户更好地管理邮票收藏。例如,用户可以添加自定义标签和分类来组织邮票,方便快速检索和浏览。另外,用户还可以将邮票按照不同的主题、系列或分类进行组织,以便更好地展示和分享邮票收藏。通过图片导入功能,用户可以将自己的邮票图像直接导入软件,并与邮票记录相关联,以便更直观地浏览和展示。 stamps 4.1 还提供了打印和导出功能,用户可以打印自己的邮票收藏清单,或者导出邮票记录到Excel或其他文件格式中,以便与他人分享或备份。此外,软件还自带了一个内置的搜索功能,用户可以根据关键词快速搜索某张特定的邮票,方便用户在大规模邮票收藏中迅速定位。 总而言之,stamps 4.1 是一个实用且功能强大的邮票收集和管理软件,它可帮助用户轻松组织、浏览和管理自己的邮票收藏,以更好地了解和欣赏自己的邮票收藏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值