P1021 邮票面值设计——搜索+完全背包

时间:2021-10-14 08:43:07

P1021 邮票面值设计

题目意思是你最多用n张邮票,你可以自己设定k种邮票的面值,每种邮票数量无穷,你最多能用这k种邮票在不超过n张的情况下,组合成的价值要求是从1开始连续的,

求最大能连续到多少;

有完全背包背包的身影,我们知道每个物品的重量是1,但是我们不知道每个物品的价值是多少,这需要我们枚举;

我们如何枚举?

对于当前第x种邮票,它能赋予的值得范围是什么?

显然我们不能赋值前面已经使用过的数,我们需要的是让连续的最大数增长;

那就是前一个数+1,但是不能超过前面使用过的数能表示的最大值+1。否则表示的数是不连续的;

因为前面的数连续最大能表示mx,再加一个mx+2或者更大的数是不能表示mx+1的;

加上我们刚赋值的数能表示的最大值是多少?

完全背包解决问题;

设f[j]表示价值为j时最少用几张邮票;

然后从1开始遍历到a[now]*now(能表示的最大值,虽然可能达不到),再判断一下边界n就好了;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+;
int n,k;
int f[maxn];
int mon[],ans[],ans_mx; int dp(int x,int mx)
{
memset(f,0x3f,sizeof(f));
f[]=;
for(int i=;i<=x;i++)
{
for(int j=mon[i];j<=mon[x]*n;j++)
{
f[j]=min(f[j],f[j-mon[i]]+);
}
}
for(int i=;i<=mon[x]*n;i++)
{
if(f[i]>n) return i-;
}
return mon[x]*n;
} void dfs(int x,int mx)
{
if(x==k+)
{
if(mx>ans_mx)
{
ans_mx=mx;
for(int i=;i<=k;i++) ans[i]=mon[i];
}
return ;
}
for(int i=mon[x-]+;i<=mx+;i++)
{
mon[x]=i;
int now_mx=dp(x,mx);
dfs(x+,now_mx);
}
}
int main()
{
scanf("%d%d",&n,&k);
dfs(,);
for(int i=;i<=k;i++)
{
printf("%d ",ans[i]);
}
printf("\n");
printf("MAX=%d\n",ans_mx);
return ;
}

P1021 邮票面值设计——搜索+完全背包的更多相关文章

  1. P1021 邮票面值设计(dfs&plus;背包dp)

    P1021 邮票面值设计 题目传送门 题意: 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15N+K≤15)种邮票的情况下 (假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大 ...

  2. P1021 邮票面值设计

    P1021 邮票面值设计 题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX ...

  3. 洛谷P1021邮票面值设计 &lbrack;noip1999&rsqb; dp&plus;搜索

    正解:dfs+dp 解题报告: 传送门! 第一眼以为小凯的疑惑 ummm说实话没看标签我还真没想到正解:D 本来以为这么多年前的noip应该不会很难:D 看来还是太菜了鸭QAQ 然后听说题解都可以被6 ...

  4. 洛谷P1021 邮票面值设计

    题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到 ...

  5. NOIP1999邮票面值设计&lbrack;搜索&vert;DP&rsqb;

    题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到 ...

  6. noip 邮票面值设计 - 搜索 - 动态规划

    描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定M(N+M<=10)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max ,使得1-max之间的每一个邮资值都能 ...

  7. 洛谷 P1021 邮票面值设计

    题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到 ...

  8. 洛谷——P1021 邮票面值设计

    https://www.luogu.org/problem/show?pid=1021 题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都 ...

  9. 洛谷P1021邮票面值设计

    题目 一道很经典的搜索题,可以锻炼搜索的能力,比如可以用dfs覆盖加dp的方式来寻找+更新答案.而且还可以通过在递归中增加数组的方式来辅助搜索. #include <bits/stdc++.h& ...

随机推荐

  1. Vue2&period;0用components替换render报错

    怀疑是webpack配置的问题,改了一下午也没弄好.去群里问了一轮,也没个解决的. 在研究的过程中,发现了一篇好的讨论帖,看这个帖子能学到不少东西.暂时放弃这个问题的研究了,太费时间,要深入学习编译原 ...

  2. BZOJ 1041&colon; &lbrack;HAOI2008&rsqb;圆上的整点

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3621  Solved: 1605[Submit][Sta ...

  3. Java--剑指offer(6)

    26.输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. /** public class TreeNode { int val = 0 ...

  4. C&num;获取url中参数键值对的方法

    方法如下: /// <summary> /// 遍历Url中的参数列表 /// </summary> /// <returns>如:(?userName=keley ...

  5. js字符串函数&lpar;split、join、indexOf、substring&rpar;

    1,函数:split()功能:使用一个指定的分隔符把一个字符串分割存储到数组示例: str="jpg|bmp|gif|ico|png";arr= str .split(" ...

  6. TMS3705A PCF7991AT 线路图

  7. Windows下用WinSCP传输数据到Linux上

    Scenario:最近公司做的一个项目,UI部分我是使用python在编译时做localization的,是linux下运行的,但是开发是在windows下进行的每次编译后都要手动通过WinSCP这个 ...

  8. 云计算之openstack mitaka 配置详解(将疑难点都进行划分)

    在配置openstack项目时很多人认为到处是坑,特别是新手,一旦进坑没有人指导,身体将会感觉一次次被掏空,作为菜鸟的我也感同身受,因为已经被掏空n次了. 以下也是我将整个openstack配置过程进 ...

  9. 关于Prometheus运维实践项目

    关于Promethues运维实践项目 1. 什么是Prometheus运维实践项目 ​ 是什么 ​ Prometheus,普罗米修斯,是古希腊神话中为人间带来火种的神. ​ Prometheus运维实 ...

  10. 动态添加布局、动态添加View、LinearLayout动态添加View;

    LinearLayout提供了几个方法,用作动态添加View特别好用: 可以添加View.删除View.删除指定位置View.删除全部View: 看代码: public class MainActiv ...