dp[i][j]表示前i个元素,子集和为j的个数。d[i][j] = d[i][j] + d[i-1][j-k] (第i个元素的值为k)。这里可以优化成一维数组

比如序列为 1 2 3,每一步的dp值为

1 0 0 0 0 0 0  (d[0][0]=1)

1 1 0 0 0 0 0

1 1 1 1 0 0 0

1 1 1 2 1 1 1

最终的序列就是题目给出的B序列,把B序列减去每一次dp得到的序列,第一个非0值就是a序列中的值

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. #define max_n 10010
  6. using namespace std;
  7. int a[max_n], b[max_n], dp[max_n];
  8. //dp[i]表示:和为i的子集个数
  9.  
  10. int main()
  11. {
  12. // freopen("in.txt","r",stdin);
  13. int t, n, m;
  14. scanf("%d", &t);
  15. while(t--)
  16. {
  17. memset(dp, 0, sizeof(dp));
  18. scanf("%d %d", &n, &m);
  19. for(int i = 0; i <= m; i++)
  20. scanf("%d", &b[i]);
  21. dp[0] = 1; //初始化值
  22. int num = 0;
  23. for(int i = 1; i <= m; i++)
  24. {
  25. int t = b[i] - dp[i];//A序列中值为i的个数
  26. for(int j = 0; j < t; j++)
  27. {
  28. a[num++] = i; //对A序列赋值
  29. for(int k = m; k>= i; k--) //处理成01背包
  30. {
  31. dp[k] += dp[k - i]; //计算和为k的A子集个数
  32. }
  33. }
  34. }
  35. for(int i = 0; i < num; i++)
  36. {
  37. if(i > 0) printf(" ");
  38. printf("%d", a[i]);//输出A序列
  39. }
  40. printf("\n");
  41. }
  42. return 0;
  43. }

hdu 6092 Rikka with Subset 01背包 思维的更多相关文章

  1. HDU 6092`Rikka with Subset 01背包变形

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  2. hdu 6092 Rikka with Subset(逆向01背包+思维)

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  3. HDU 6092 Rikka with Subset

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  4. hdu 6092 Rikka with Subset (集合计数,01背包)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  5. hdu 6092 Rikka with Subset(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6092 #include <cstdio> #include <iostream> ...

  6. HDU 6092 Rikka with Subset(dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=6092 题意: 给出两个数组A和B,A数组一共可以有(1<<n)种不同的集合组合,B中则记录了每个数出 ...

  7. 2017 ACM暑期多校联合训练 - Team 5 1008 HDU 6092 Rikka with Subset (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  8. HDU 6092:Rikka with Subset(dp)

    分析 很多个较小的数字可以随机组合成较大的数字,所以B数组从小到大开始遍历,除了空集,最小的那个存在的个数对应的数字必然是a数组中的数字. 每求出这一部分之后,更新后续的B序列. 分析完后,主要的难点 ...

  9. HDU 5234 Happy birthday --- 三维01背包

    HDU 5234 题目大意:给定n,m,k,以及n*m(n行m列)个数,k为背包容量,从(1,1)开始只能往下走或往右走,求到达(m,n)时能获得的最大价值 解题思路:dp[i][j][k]表示在位置 ...

随机推荐

  1. && echo suss! || echo failed

    ### && echo suss! || echo failed 加在bash后 ########ls /proc && echo suss! || echo fail ...

  2. 基于端口划分vlan

    基于端口划分vlan 拓扑图 PC ip 配置 PC 5:192.168.1.5 PC 6:192.168.1.6 PC 7:192.168.1.7 PC 8: 192.168.1.8 交换机配置 创 ...

  3. Zabbix 监控系统部署

    Zabbix 监控系统部署 实验环境 Zabbix server:RHEL8 ip:192.168.121.10 一.关闭防火墙和selinux [root@Zabbix-server ~]# sys ...

  4. 使用cockpit管理kvm虚拟机

    在Centos8.2主机上部署kvm,使用cockpit管理 首先检测cpu是否支持虚拟化 [root@localhost ~]# cat /proc/cpuinfo | grep vmx flags ...

  5. win10 启用Hyper-V并安装Ubuntu20.10

    本文的最终目的是要将.netcore5.0(.net5.0)部署在Ubuntu中的docker容器中. 当前环境: 主系统:win10家庭版 虚拟机:Hyper-V (win10自带虚拟机) 虚拟机系 ...

  6. MyBatis 全局配置文件详解(七)

    MyBatis 配置文件作用 MyBatis配置文件包含影响 MyBatis 框架正常使用的功能设置和属性信息.它的作用好比手机里的设置图标,点击这个图标就可以帮助我们查看手机的属性信息和设置功能.其 ...

  7. cp1 项目管理概述

    项目不成功:问题很多 chapter__1 ① 任务不明确 ② 变更 ③ 新技术 ④ 成本 ⑤ 进度 ⑥ 质量问题 ⑦ 开发混乱 ⑧ 用户 项目定义 项目 (Project) 是为了创造一个唯一的产品 ...

  8. 一个很好的网站 有3D漂浮框 有动态小人数字时钟

    http://www.cnblogs.com/jingmoxukong/p/7867397.html

  9. Java 将Excel转为SVG的方法

    本文以Java示例展示如何将Excel文档转为SVG格式.通过本文中的方法,在将Excel转为SVG时,如果sheet工作表中手动设置了分页,则将每个分页的内容单独保存为一个svg文件,如果sheet ...

  10. 安卓开发(2)—— Kotlin语言概述

    安卓开发(2)-- Kotlin语言概述 Android的官方文档都优先采用Kotlin语言了,学它来进行Android开发已经是一种大势所趋了. 这里只讲解部分的语法. 如何运行Kotlin代码 这 ...