【题目 描述】

小蛇是金融部部长。 最近她决定制造一系列新的货币。 假设她要制造的货币 的面值为 x1, x2, x3… 那么 x1 必须为 1, xb 必须为 xa 的正整数倍(b>a)。 例如 1, 5, 125, 250 就是一组合法的硬币序列, 而 1, 5, 100, 125 就不是。 不知从哪一天开始, 可爱的蛇爱上了一种萌物——兔子! 从此, 小蛇便走上 了遇上兔子娃娃就买的不归路。 某天, 小蛇看到了 N 只可爱的兔子, 假设这 N 只 兔子的价钱分别是 a1, a2…aN。 现在小蛇想知道, 在哪一组合法的硬币序列下, 买这 N 只兔子所需要的硬币数最少。 买兔子时不能找零。

【输入格式】

第一行, 一个整数 N, 表示兔子的个数 第二行, N 个用空格隔开的整数, 分别为 N 只兔子的价钱

【输出格式】

一行, 一个整数, 表示最少付的钱币数。

【样例输入】

2

25 102

【样例输出】

4

【样例解释】

本次比赛试题由厦门一中提供 共有两只兔子, 价钱分别为 25 和 102。 现在小蛇构造 1, 25, 100 这样一组 硬币序列, 那么付第一只兔子只需要一个面值为 25 的硬币, 第二只兔子需要一 个面值为 100 的硬币和两个面值为 1 的硬币, 总共两只兔子需要付 4 个硬币。 这 也是所有方案中最少所需要付的硬币数。

【数据范围与约定】

对于 20%的数据, 1<=N<=20, 1<=ai<=5, 000

对于 100%的数据, 1<=N<=50, 1<=ai<=100, 000 部分数据随机.


一道不错的动态规划,考试的时候完全完全没有思路呢。

先考虑DP数组 f[i] 表示此时硬币面额的最大值为i时,买所有小兔纸所用的最少硬币,显然边界的 f[1]=∑1n ai

然后是转移。

f[i*j]=min(f[i*j],f[i]-ts[i*j]*(j-1)) (SMG??)

首先i和j都是数字i*j的因子咯,所以一个面值为i*j的硬币相当于j个面值为i的硬币,即j个i硬币可以变成  1 个i*j硬币,所以硬币数量就会减少 (j-1) 个啦。

然后ts数组里存的是i*j这个硬币最多可以用几次,就是 Sigma{a[k]/(i-j)} (打Sigma好辛苦)

具体看代码吧(并没有很长)

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> #define For(i,a,b) for(register int i=a;i<=b;++i)
#define Re register
#define inf 0x7f7f7f
using namespace std;
const int N=,MN=1e5+;
int a[N],ts[MN],f[MN];
int n,mx=,fn;
inline void read(int &v){
v=;
char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<='')v=v*+c-'',c=getchar();
}
int main(){
// freopen("coin.in","r",stdin);
// freopen("coin.out","w",stdout);
read(n);
memset(f,inf,sizeof(f));
For(i,,n) read(a[i]),mx=max(a[i],mx);
For(i,,mx) For(j,,n) ts[i]+=a[j]/i;
fn=ts[]; f[]=ts[];
For(i,,mx){
fn=min(fn,f[i]);
for(Re int j=;j*i<=mx;++j){
f[i*j]=min(f[i*j],f[i]-ts[i*j]*(j-));
}
}
cout<<fn<<endl;
return ;
}

【BZOJ 3233】 [Ahoi2013]找硬币的更多相关文章

  1. BZOJ 3233: [Ahoi2013]找硬币

    BZOJ 3233: [Ahoi2013]找硬币 标签(空格分隔): OI-BZOJ OI-DP Time Limit: 10 Sec Memory Limit: 64 MB Description ...

  2. BZOJ 3233: [Ahoi2013]找硬币( dp )

    dp(x)表示最大面值为x时需要的最少硬币数. 枚举x的质因数p,  dp(x) = min( dp(x/p) - (p-1) * sigma[a[i]/x] ). ----------------- ...

  3. [Bzoj3233][Ahoi2013]找硬币[基础DP]

    3233: [Ahoi2013]找硬币 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 482[Submit][Status][ ...

  4. [AHOI2013]找硬币(搜索)

    [Ahoi2013]找硬币 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 348  Solved: 114[Submit][Status] Descri ...

  5. 【bzoj 3233】[Ahoi2013]找硬币 ——搜索

    Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...

  6. BZOJ3233:[AHOI2013]找硬币(DP)

    Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...

  7. [bzoj3233] [Ahoi2013]找硬币

    一开始没什么思路...后来想到确定最大硬币面值就知道其他面值能取多少了..而且结果是可以由较小的面值转移过来的. f[i]表示最大面值为i时的最小硬币数.a[i]表示第i个物品的价钱. f[i]=mi ...

  8. [BZOJ 3233] 找硬币

    Link: BZOJ 3233 传送门 Solution: 在本蒟蒻看来算是一道比较神的$dp$了 一开始转移方程都没看出来…… 首先,如果确定了最大面值,是能推出其他面值的所有可能值的 从而发现最大 ...

  9. 【刷题】BZOJ 4566 [Haoi2016]找相同字符

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别为 ...

随机推荐

  1. myeclipse10.0如何集成Git

    现需要给myeclipse10.0集成git工具,经过搜索资料,现整理如下方法: myeclipse10.0对应的Git版本应该为:egit版本为2.3.1 下载地址:http://wiki.ecli ...

  2. s:text

    <s:text>是Struts2用来显示资源文件中信息或格式化数据时使用的,一般要配合<s:i18n>标签.

  3. Protocol_ISIS

    集成ISIS协议 作者:Danbo 2015-7-5 ISIS的意思是表示中间系统,并且是为OSI无连接网络协议(OSI Conectionless Network Protocol,CLNP)设计的 ...

  4. Codeforces Round #394 (Div. 2) D. Dasha and Very Difficult Problem —— 贪心

    题目链接:http://codeforces.com/contest/761/problem/D D. Dasha and Very Difficult Problem time limit per ...

  5. Chapter 3 Shared Assemblies and Strongly Named Assemblies

    As time marches on,MS developers and control developer modify their code:they fix bugs,patch securit ...

  6. [Tyvj Aug11] 黄金矿工

    传送门 Description 黄金矿工是一个经典的小游戏,它可以锻炼人的反应能力.该游戏中,可以通过“挖矿”获得积分并不断升级.玩家可以在线玩flash版黄金矿工,也可以下载后玩单机版黄金矿工.目前 ...

  7. jquery的跨域请求

    项目中关于ajax jsonp的使用,出现了问题:可以成功获得请求结果,但没有执行success方法总算搞定了,记录一下 function TestAjax() {    $.ajax({       ...

  8. 光流 LK 金字塔

    文章转载自:https://blog.csdn.net/sgfmby1994/article/details/68489944 光流是图像亮度的运动信息描述,这种运动模式指的是由一个观察者(比如摄像头 ...

  9. C语言之数组与指针的易混淆知识点

    一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...

  10. JAVA 中的堆和栈

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.     Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.n ...