硬币
总时间限制: 1000ms 内存限制: 262144kB
描述
宇航员Bob有一天来到火星上,他有收集硬币的习惯。于是他将火星上所有面值的硬币都收集起来了,一共有n种,每种只有一个:面值分别为a1,a2… an。 Bob在机场看到了一个特别喜欢的礼物,想买来送给朋友Alice,这个礼物的价格是X元。Bob很想知道为了买这个礼物他的哪些硬币是必须被使用的,即Bob必须放弃收集好的哪些硬币种类。飞机场不提供找零,只接受恰好X元。
输入
第一行包含两个正整数n和x。(1 <= n <= 200, 1 <= x <= 10000)
第二行从小到大为n个正整数a1, a2, a3 … an (1 <= ai <= x)
输出
第一行是一个整数,即有多少种硬币是必须被使用的。
第二行是这些必须使用的硬币的面值(从小到大排列)。
样例输入
5 18
1 2 3 5 10
样例输出
2
5 10
提示
输入数据将保证给定面值的硬币中至少有一种组合能恰好能够支付X元。
如果不存在必须被使用的硬币,则第一行输出0,第二行输出空行。
写在前面:啥也不说了,今天就写the flash的列传了
——————————————————————————————————————————————
思路:我首先想到用01背包求方案个数,接下来就有点虚了,最后对每种硬币进行枚举,去掉每种硬币再进行01背包dp,如果最后方案数为0,那么这种硬币一定是必须用的,但是这种方法时间复杂度为O(n×n×x),接近4*10^8,即使加了一些优化(当方案数>0即退出当前循环)也还是TLE,无奈请教聪哥(the flash),聪哥的方法是再开一个g数组,得出对于去掉第i种硬币,体积为j时g[j]=f[j]-g[j-a[i]],即g代表去掉某一种硬币后的方案数(实在觉得自己说不清楚,还是看代码吧),这样就可以把时间复杂度缩小到O(n×x)
代码:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,a[21000],f[20010],x;
int g[20010],num[20010];
int in()
{int t=0;char ch=getchar();while (ch>'9'||ch<'0') ch=getchar();while (ch>='0'&&ch<='9') t=t*10+ch-'0',ch=getchar();return t;
}
main()
{n=in();x=in();for (int i=1;i<=n;i++) a[i]=in();f[0]=1;for (int i=1;i<=n;i++)for (int j=x;j>=a[i];j--)f[j]+=f[j-a[i]];//得出不去除硬币时的方案数for (int i=1;i<=n;i++){memset(g,0,sizeof(g));for (int j=0;j<=x;j++)if (j-a[i]>=0)g[j]=f[j]-g[j-a[i]];else g[j]=f[j];if (g[x]==0) num[++num[0]]=a[i];}printf("%d\n",num[0]);for (int i=1;i<=num[0];i++) printf("%d ",num[i]);
}

【OJ4976】硬币,神奇的背包相关推荐

  1. 【codevs1869】硬币购物,背包+神奇的容斥原理

    硬币购物 2008年 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 一共有4种硬币.面值分别为c1,c2,c3,c4.某 ...

  2. 洛谷P1450:硬币购物(背包、容斥)

    解析 呜呜呜不废啊 我只会跑n遍多重背包 感觉非常神仙的一道题 之所以只是蓝的可能是因为代码实现难度太低了吧 但感觉思想真的很难想到 也可能是我太菜了 容斥相关还是需要加强啊qwq 考虑如果没有硬币个 ...

  3. 最少硬币问题----多重背包

    问题描述: 设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n ]中.现要用这些面值的硬币来找钱.可以使用的各种面值的硬币个数存于数组Coins[1:n ]中.对任意钱数0≤m≤20001,设计 ...

  4. 【每日DP】day 9、P1156 垃圾陷阱(神奇的背包,时间节点处理)难度⭐⭐⭐

    P1156 垃圾陷阱 每个垃圾只能用一次,典型的01背包. 关键是时间的处理 ll f[N];题目要中求的是生存的最长时间,所以这里的f[i]是指高度i时生存的最长时间 对于每一块垃圾,我们都有两种选 ...

  5. Bailian4120 硬币【0-1背包】

    4120:硬币 总时间限制: 1000ms 内存限制: 262144kB 描述 宇航员Bob有一天来到火星上,他有收集硬币的习惯.于是他将火星上所有面值的硬币都收集起来了,一共有n种,每种只有一个:面 ...

  6. [USACO06DEC]The Fewest Coins G(混合背包)

    [USACO06DEC]The Fewest Coins G 题目描述 Farmer John has gone to town to buy some farm supplies. Being a ...

  7. The Fewest Coins(多重背包+完全背包)

    The Fewest Coins(多重背包+完全背包) Farmer John has gone to town to buy some farm supplies. Being a very eff ...

  8. 【NOIP2017提高A组模拟9.5】 NYG的背包

    题目描述 N Y G NYG NYG有一个神奇的背包,每放进去一个物品,背包的体积就会变大. 也就是说,每放进一个物品,背包会被占用一定的体积,但是紧接着背包的总体积又会增大一定的值(注意是在放入物品 ...

  9. 代码随想录44——动态规划:完全背包理论基础、518零钱兑换II、377组合总和IV

    文章目录 1.完全背包理论基础 2.518零钱兑换II 2.1.题目 2.2.解答 3.377组合总和IV 3.1.题目 3.2.解答 4.组合和排列问题的便利顺序 4.1.组合问题 4.2.排列问题 ...

最新文章

  1. 【转】6 Reasons Why JavaScript’s Async/Await Blows Promises Away (Tutorial)
  2. 纯CSS3实现lightbox+图像轮播
  3. zabbix详解(十六)——zabbix agent自动注册实战
  4. 2012第51周星期二
  5. python中tqdm的用法
  6. Visual SourceSafe 2005(Vss2005)使用经验总结
  7. android点九切图,点九图切图规范
  8. 从零开始的RVOS: Referring Video Object Segmentation
  9. 魔兽世界怀旧服 八区最新服务器推荐,魔兽世界怀旧服选择哪一个服务器好[多图]...
  10. (69)zabbix监控惠普打印机
  11. VuePress自动化部署到GitHub服务器
  12. Python ctypes 调用API函数模拟键盘鼠标事件
  13. ethercat 原理 implementation ...
  14. JSP简明教程:汇总
  15. 科技巨头Software AG遭攻击,关闭445高危端口后,Windows共享用不了,怎么办?
  16. c#通过输入年月日输出该月的天数
  17. 手相、面相、痣向、生辰八字
  18. 函数:我的地盘听我的+习题复习
  19. 软件开发实训(720实训)——3细述QQ与TIM的不同之处
  20. Unity2D横版游戏开发(一) 人物的移动和跳跃

热门文章

  1. 在modelarts上部署mask-rcnn模型
  2. matepad适配鸿蒙,消息称华为 MatePad2 搭载骁龙888 4G 华为鸿蒙OS计划适配高通平台...
  3. mysql表的级联操作_mysql表之间的关系及级联操作
  4. 数据结构-动态查找树表与平衡二叉树 红黑树简单介绍
  5. 再谈注意力机制 | 运用强化学习实现目标特征提取
  6. matlab 动画_MATLAB作图实例:51:表面动画
  7. 【java基础知识】修改字符串的编码格式
  8. centos7 mysql 冲突_CentOS7安装MySQL冲突和问题解决小结
  9. linux判断值相等_Shell字符串比较相等、不相等方法小结【转】
  10. JDK配置与防火墙设置