NOI 4976:硬币

描述

宇航员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,第二行输出空行
思路:解题思路:我们考虑a[i]是否满足其实必须元素,容易想到,f[x]-f[x-a[i]]是否为零,但是f[x-a[i]]的方案数中可能也会用到a[i],所以f[x-a[i]]-f[x-a[i]*2],整理一下就是f[x]-f[x-a[i]]+f[x-a[i] *2],也很容易发现容斥规律,由此可以递归求解,递归边界为x-a[i] *k<0或者f[x-a[i] *k]==0; 
例如:测试数据,01背包后  
f=(1,1,1,2,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2)
那么, f[18]->f[15]  使用了3,
          但是,15=10,5  或  15=10,2,3;
          这样,我们就多考虑了一种情况;
所以,要加上这种多考虑的情况

program ex03;
var f:array[0..10000] of int64;
    a,ans:array[0..1000] of longint;
    n,tot,x:longint;
procedure dp;                      //01背包
var i,j:longint;
begin
  f[0]:=1;
  for i:=1 to n do
   for j:=x downto a[i] do
   begin
      f[j]:=f[j]+f[j-a[i]];
    end;
end;
procedure init;
var i:longint;
begin
  readln(n,x);
  for i:=1 to n do read(a[i]);
end;
function cal(x,y:longint):longint;
begin
  if x<0 then exit(0) else exit(f[x]-cal(x-y,y));
end;
procedure doit;
var i:longint;
begin
  for i:=1 to n do
  begin
    if f[x]-cal(x-a[i],a[i])=0 then       //判断是否必要
    begin
      inc(tot);
      ans[tot]:=a[i];
    end;
  end;
end;
procedure print;
var i:longint;
begin
  writeln(tot);
  for i:=1 to tot do
  write(ans[i],‘ ‘);
end;
begin
  init;
  dp;
  doit;
  print;
end.

时间: 2024-08-10 06:19:45

NOI 4976:硬币的相关文章

【bzoj1042】 HAOI2008—硬币购物

http://www.lydsy.com/JudgeOnline/problem.php?id=1042 (题目链接) 题意:共有4种硬币,面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s的价值的东西.请问每次有多少种付款方法. Solution  容斥原理.  设F[i]为不考虑每种硬币的数量限制的情况下,得到面值i的方案数.则状态转移方程为 F[i]=Sum{F[i-C[k]] | i-C[k]>=0 且 k=1..4} ,边界条件F[0]=0. 

[NOI2011]Noi嘉年华

题目描述 NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动,而每个活动只能在一个嘉年华中举办. 现在嘉年华活动的组织者小安一共收到了 n个活动的举办申请,其中第 i 个活动的起始时间为 Si,活动的持续时间为Ti.这些活动都可以安排到任意一个嘉年华的会场,也可以不安排. 小安通过广泛的调查发现,如果某个时刻,两个嘉年华会场同时有活动在进行(不包括活动的开始瞬间和结束瞬间)

[HAOI2008]硬币购物

[HAOI2008]硬币购物 题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s 输出格式: 每次的方法数 输入输出样例 输入样例#1: 1 2 5 10 2 3 2 3 1 10 1000 2 2 2 900 输出样例#1: 4 27 说明 di,s<=100000 to

蓝桥杯 [翻硬币] 贪心

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T29 题目大意:给两个串,初始串和目标串,每一位表示硬币的正反状态.一次操作的定义是让两个相邻的硬币反面.问从初始状态到目标状态所需要的最少操作次数是多少. 关键思想:贪心.要知道如果两个串的某一位不同,那这一位必然要经历奇数次操作,而且先翻或者后翻是没有影响的.那你想,既然是奇数次,那么最好的情况就是一次搞定啊.解决方案是有的,也很容易想--从左到右扫描,一旦扫描到一位不同,就执行一次操作,而此后的所有操

动态规划 硬币问题

题目:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的 最小值和最大值! 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出 解,比如1元换成2元的时候) 首先我们思考一个问题,如何用最少的硬币凑够i元(i<11)?为什么要这么问呢? 两个原因:1.当我们遇到一个大问题时,总是习惯把问题的规模变 小,这样便于分析讨论. 2.这个规

【TK】1025: 统计硬币

1025: 统计硬币 时间限制: 1 Sec  内存限制: 32 MB提交: 2409  解决: 1107[提交][状态][下载(1元)] 题目描述 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). 输入 输入数据第一行有一个正整数T,表示有T组测试数据.接下来的T行,每行有两个数n,m,n和m的含义同上. 输出 对于每组测试数据,请输出可能的组合方式数,每组输出占一行. 样例输入 2 3 5 4 8 样例输出 1 2 1 0

bzoj4622 [NOI 2003] 智破连环阵

Description B国在耗资百亿元之后终于研究出了新式武器——连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过A国间谍的侦察发现,连环阵其实是由M个编号为1,2,…,M的独立武器组成的.最初,1号武器发挥着攻击作用,其他武器都处在无敌自卫状态.以后,一旦第i(1<=i< M)号武器被消灭,1秒种以后第i+1号武器就自动从无敌自卫状态变成攻击状态.当第M号武器被消灭以后,这个造价昂贵的连环阵就被摧毁了.为

luogu P1146 硬币翻转

题目描述 在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上.现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然).求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作). 输入输出格式 输入格式: 输入只有一行,包含一个自然数N(N为不大于100的偶数). 输出格式: 输出文件的第一行包含一个整数S,表示最少需要的操作次数.接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:0――正面向上,

P1146 硬币翻转

题目描述 在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上.现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然).求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作). 输入输出格式 输入格式: 输入只有一行,包含一个自然数N(N为不大于100的偶数). 输出格式: 输出文件的第一行包含一个整数S,表示最少需要的操作次数.接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:0――正面向上,