首页 > 其他分享 >洛谷P1021题解

洛谷P1021题解

时间:2022-10-26 22:17:38浏览次数:126  
标签:邮票 洛谷 int 题解 text P1021 MAX 面值 include

原题

P1021 [NOIP1999 提高组] 邮票面值设计


思路概述

题意分析

给定两个整数 \(N,K(N+K≤15)\),设计 \(K\) 种邮票面值\(\{a_1,a_2\dots a_K\}\),并用共 \(N\) 张上述邮票表示出连续面值 \(\{1,2,3\dots MAX\}\)。要求设计出的邮票能表示出的连续面值 \(MAX\) 最大。最后输出设计的邮票面值 \(\{a_i|1≤i≤K\}\) 与能表示出的最大连续面值 \(MAX\)。

思路简述

邮票面值只能靠深搜(原因后文阐述)。

由于需要表示出连续的面值,所以需要更大面值的情况是当且仅当当前种类的邮票无法表示出该面值,故可以按递增顺序选取面值。

对于已经选取出的邮票,则需要计算出其能表示出的最大面值。此处可以用01背包的思路解决:

\[\text{令}f_x\text{表示表示出面值}x\text{所需要的邮票数(下同)} \]

\[rec_i\text{表示第}i\text{张邮票的面值(下同)} \]

\[\text{则有}f_i=\min \{f_{i-rec_j}+1\},j∈[1,k] \]


算法实现

关于深搜的正确性

首先可以知道一条显而易见的结论:\(a_1=1\)。

然后可以分析得知的是,并非邮票面值设置越大,表示的最大面值就越大,例如对于数据 \(N=3,K=2\),若选取邮票面值 \(\{1,4\}\),则只能表示面值范围 \([1,6]\);而取 \(\{1,3\}\) 时,则可以表示面值 \([1,7]\)。因此,为确保正确性,又考虑到数据规模较小,本题采用深搜查找邮票面值组合。

关于深搜策略与范围

由于是需要表示出最大的面值,所以在当前选取的邮票面值可以表示的情况下,不轻易再选取更大的面值。相应地,选取更大面值的条件就是当前选取的面值在 \(N\) 张的数量限制内不能表示目前考虑的面值,即 \(f_i>n\)。

考虑一种极端情况(尽管这种情况不可能出现),若当前的最大面值取到 \(MAX\),那么\(n\) 个面值为 \(MAX\) 的邮票加在一起只能表示面值 \(n·MAX\),而面值 \(n·MAX+1\) 则需要选取更大面值的邮票。故 \(MAX'∈[MAX+1,n·MAX+1]\)。


AC code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<set>
#include<ctime>
#define RI register int
using namespace std;
const int maxn=3e2+10;
int n,k,maximum;
int f[maxn],rec[maxn],ans[maxn];
inline int calc(int pos);
inline void dfs(int pos);
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin >> n >> k;
	rec[1]=1;dfs(2);
	for(RI i=1;i<=k;++i) printf("%d ",ans[i]);printf("\nMAX=%d",maximum);
	return 0;
}
inline int calc(int pos)
{
	for(RI i=1;i<=maxn-1;++i) f[i]=0x3f3f3f3f;
	for(RI i=1;i<=maxn-1;++i)
	{
		for(RI j=1;j<=pos && i-rec[j]>=0;++j)
			if(f[i-rec[j]]<n) f[i]=min(f[i],f[i-rec[j]]+1);
		if(f[i]==0x3f3f3f3f) return i-1;
	}
}
inline void dfs(int pos)
{
	if(pos>k) 
	{
		RI temp=calc(k);
		if(temp>maximum)
		{
			maximum=temp;
			for(RI i=1;i<=k;++i) ans[i]=rec[i];
		}
	}
	else
	{
		for(RI i=1;i<=rec[pos-1]*n;++i)
		{
			rec[pos]=rec[pos-1]+i;
			dfs(pos+1);
		}
	}
	return;
}

标签:邮票,洛谷,int,题解,text,P1021,MAX,面值,include
From: https://www.cnblogs.com/frkblog/p/16830241.html

相关文章

  • 洛谷P1064题解
    原题P1064[NOIP2006提高组]金明的预算方案思路概述题意分析给定一个体积为\(n\)的背包和\(m\)个物品。每个物品通过\((\text{价值},\text{体积})\)的形式表......
  • CF Round #829 题解 (Div. 2)
    F没看所以摆了.看拜月教教主LHQ在群里代打恰钱/bx目录A.TechnicalSupport(*800)B.KevinandPermutation(*800)C.MakeNonzeroSum(C1*1300,C2*1500)D.F......
  • 洛谷 P7003
    考虑当左端点固定时,区间的\(\&\)和至多有\(\logw\)种,因为\(1\)的数量是单调不升的。所以我们可以枚举区间左端点\(i\),然后ST表预处理区间\(\&\)和+二分求出......
  • Error: Cannot find module 'gifsicle'问题解决
    运行报错 Error:Cannotfindmodule'gifsicle'解决办法:删除nodu_modules下的image-webpack-loader包npmuninstallimage-webpack-loader重新安装npminstall......
  • CF 464C Substitutes in Number 题解
    前置知识:\((a+b)\equiv(a\bmodp+b\bmodp)\pmod{p}\)。同余定理使用后不能再修改数字。那么为了能用这个公式,我们倒序处理每个数字。定义\(d_i\)为\(10\)的位数\(......
  • 2022/10/26 考试题解
    又被抓摆了/kkT4(T3?)CactustoTreelinkSolutiontmd,连tm\(\Theta(n^2)\)都没有看出来!!!!!!/fn考虑\(\Theta(n^2)\)怎么做,其实就是对于每一个点直接BFS(似乎对正解也没有......
  • 洛谷P2512 [HAOI2008]糖果传递
    SLOJP1117.糖果传递题目描述有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为11。输入格式小朋友个数n,下面n行ai​......
  • 洛谷 P6453
    设第\(i\)列高\(h_i\),建立序列\(h_i\)的小根笛卡尔树,然后树形DP。发现这样就将原来不规整的图形剖分成若干个矩形:我们发现,这样构成的若干个矩形正好对应小根笛卡......
  • 洛谷优秀油猴插件推荐
    前言转载自眭然的博客,有改编和新增下载链接油猴zip1.先打开edge浏览器的扩展(其他浏览器应该也可以加扩展,不过edge最好)2.打开开发者模式和允许来自其他应用商店的......
  • CSPS2019 括号树 题解
    链的部分分我们设f[i]表示以i结尾的括号序列有多少个,那么i的实际答案就是f的前缀和显然,所有左括号和不能匹配的右括号的f均为0对于每一个能匹配的右括号i,我们找到与之......