背包与构造

题目:给定一个数,求它最少可以用多少个包含字符串"61"的数字来表示,并输出这些数。

分析:对于大于6161的任何一个整数,都有如下表示

对于小于1616的数,直接背包即可。

代码:

#include <string.h>
#include <iostream>
#include <stdio.h>

using namespace std;
typedef long long LL;
const int N = 10005;
const int INF = 0x3f3f3f3f;

int dp[N];
int pre[N];
int v[N];

bool check(LL n)
{
    int a[20];
    int cnt = 0;
    while(n)
    {
        a[cnt++] = n % 10;
        n /= 10;
    }
    for(int i = 0;i < cnt-1;i++)
        if(a[i] == 1 && a[i+1] == 6)
            return true;
    return false;
}

void ouput(int n)
{
    if(pre[n] != 0) ouput(pre[n]);
    printf(" %d",n - pre[n]);
}

int main()
{
    int T;
    LL n;
    scanf("%d",&T);
    int num = 0;
    for(int i = 1;i <= 6161;i++)
        if(check(i))
            v[num++] = i;
    for(int i = 0;i < N;i++)
        dp[i] = INF;
    dp[0] = 0;
    pre[0] = -1;
    for(int i = 1;i < N;i++)
    {
        for(int j = 0;j < num && v[j] <= i;j++)
        {
            if(dp[i] > dp[i-v[j]] + 1)
            {
                dp[i] = dp[i-v[j]] + 1;
                pre[i] = i - v[j];
            }
        }
    }
    while(T--)
    {
        scanf("%lld",&n);
        if(check(n))
        {
            printf("1 %lld\n",n);
            continue;
        }
        if(n >= 6161)
        {
            LL ans1 = 61;
            LL ans2 = 6100;
            n -= 6161;
            ans2 += n % 100;
            ans1 += (n / 100) * 100;
            printf("2 %lld %lld\n",ans1,ans2);
            continue;
        }
        if(dp[n] == INF)
        {
            printf("0\n");
            continue;
        }
        printf("%d",dp[n]);
        ouput(n);
        printf("\n");
    }
    return 0;
}

背包与构造,布布扣,bubuko.com

时间: 2024-10-07 02:48:21

背包与构造的相关文章

HDU - 2602 Bone Collector(01背包讲解)

题意:01背包:有N件物品和一个容量为V的背包.每种物品均只有一件.第i件物品的费用是volume[i],价值是value[i],求解将哪些物品装入背包可使价值总和最大. 分析: 1.构造二维数组:dp[i][j]---前i件物品放入一个容量为j的背包可以获得的最大价值. dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - volume[i]] + value[i]);---(a) (1)dp[i - 1][j]---不放第i件物品,因此前i件物品放入一个容量为

USACO Money Systems Dp 01背包

一道经典的Dp..01背包 定义dp[i] 为需要构造的数字为i 的所有方法数 一开始的时候是这么想的 for(i = 1; i <= N; ++i){ for(j = 1; j <= V; ++j){ if(i - a[j] > 0){ dp[i] += dp[i - a[j]]; } } } 状态存在冗余, 输出的时候答案肯定不对 但只需要改一下两个for循环的顺序即可. Source Code: /* ID: wushuai2 PROG: money LANG: C++ */ //

信息安全-4:公钥密码体制之背包算法[原创]

转发注明出处:http://www.cnblogs.com/0zcl/p/6111686.html 前言 本来我是想学RSA算法的,但发现太难了,不是我能理解的,于是我先看教材前面的背包算法.不出意料的话会在下一篇博客介绍下RSA算法! 背包问题介绍: 给定一些物体,每个物体有不同的重量,是否有可能将这些物体放入一个背包,使背包的重量等于一个给定的值. 背包算法为第一个推广的公开密钥加密算法. 虽然后来发现这个算法不安全,但仍值得研究,因为它表示了如何将NP完全问题用于公开密钥算法(好吧,这个我

HDU 5534 Partial Tree (完全背包变形)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534 题意: 给你度为1 ~ n - 1节点的权值,让你构造一棵树,使其权值和最大. 思路: 一棵树上每个节点的度至少为1,且度的和为2*n - 2.那么我们先给这些节点的度都-1,剩下的节点度为n - 2.此时我们发现,任意分配剩下的这些度给节点,都可以形成一棵树.这就变成了一个完全背包题,容量为n-2.注意dp要初始化为-inf.思路确实巧妙. 1 #include <iostream> 2

出差之前写一个0-1背包的程序吧

又要出差了,也不知道多久才能回来,这段时间应该都不能更新博客了,写了0-1背包程序热热手吧. 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MAX_NUM 20 //物品最大个数 5 #define MAX_PACK 100 //背包容量 6 7 int result[MAX_NUM][MAX_PACK]; //全局变量默认初始化0 8 9 /* 10 * 0 1背包问题动态规划方程 11 * 12 * m[i][j]

1.3 背包、队列和栈

知识点 背包:只进不出,迭代顺序不确定(即无先后顺序) 队列:先进先出 栈   :后进先出 两种基础数据结构:数组和链表 数据结构 优点 缺点 数组 通过索引可以访问任意元素 在初始化时就需要知道元素的数量 链表 使用的空间大小和元素数量成正比 需要通过引用访问任意元素 练习 1.3.1 为FixedCapacityStackOfStrings添加一个方法isFull().       /*其中注意N的含义,别和数组下标完全混淆*/ public class FixedCapacityStack

01背包问题-只求背包的最终最大价值,不考虑选哪些物品怎么放---最优解(欢迎讨论)

题目来自lintcode http://www.lintcode.com/zh-cn/problem/backpack/ 一个传统01背包问题的推广,假如只考一个背包放物品之后的最终最大价值,不考虑具体选哪些物品放入,该如何实现? 最蠢最笨的办法,那当然就是-老老实实的构造背包容量-物品矩阵,然后取出矩阵最上方最右的值即可: 代码也非常易懂: class Solution: # @param m: An integer m denotes the size of a backpack # @pa

hdu 5312 dp(背包)、二分图或其他姿势

题意:给出一个二分图(不一定连通),问最多能加多少边,使它仍然是二分图 BC周年庆第四题,貌似终判再终判之后数据还是有问题``` 据说貌似可以用bitset搞,而且姿势优美是正解```然而我还是用的dp过的 首先就是用黑白染色判断每个区块的两边点的个数,接着因为要边数最多,所以显然要两边点数尽量接近,所以我就用01背包的方法,计算能够得到的 n/2 内的半边最大点数,中间加入已达到的最大值优化和黑白染色得到单点额外记录而不进入背包的优化```然后从TLE变成了200+ms过,只能说出数据的太执着

hdu 5534 (完全背包) Partial Tree

题目:这里 题意: 感觉并不能表达清楚题意,所以 Problem Description In mathematics, and more specifically in graph theory, a tree is an undirected graph in which any two nodes are connected by exactly one path. In other words, any connected graph without simple cycles is a