dp(x)表示最大面值为x时需要的最少硬币数.

枚举x的质因数p,  dp(x) = min( dp(x/p) - (p-1) * sigma[a[i]/x] ).

----------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
const int maxn = 59;
const int maxm = 100009;
 
int N, M, w[maxn], dp[maxm];
int p[maxm], minp[maxm], pn;
bool F[maxm];
 
template<class T>
inline void Min(T &x, T t) {
if(t < x) x = t;
}
template<class T>
inline void Max(T &x, T t) {
if(t > x) x = t;
}
 
void Init() {
scanf("%d", &N);
memset(dp, -1, sizeof dp);
M = dp[1] = 0;
for(int i = 0; i < N; i++) {
scanf("%d", w + i);
Max(M, w[i]);
dp[1] += w[i];
}
memset(F, 0, sizeof F);
pn = 0;
for(int i = 2; i <= M; i++) {
if(!F[i])
minp[i] = p[pn++] = i;
for(int j = 0; j < pn && i * p[j] <= M; j++) {
F[i * p[j]] = true;
minp[i * p[j]] = p[j];
if(i % p[j] == 0) break;
}
}
}
 
void Work() {
int ans = dp[1];
for(int i = 0; i < pn; i++) {
dp[p[i]] = 0;
for(int j = 0; j < N; j++)
dp[p[i]] += w[j] / p[i] + w[j] % p[i];
Min(ans, dp[p[i]]);
}
for(int i = 2; i <= M; i++) if(!~dp[i]) {
dp[i] = dp[1];
for(int t = i; t != 1; t /= minp[t]) {
int v = 0;
for(int j = 0; j < N; j++)
v += w[j] / i;
Min(dp[i], dp[i / minp[t]] - v * (minp[t] - 1));
}
Min(ans, dp[i]);
}
printf("%d\n", ans);
}
 
int main() {
Init();
Work();
return 0;
}

----------------------------------------------------------------------------------

3233: [Ahoi2013]找硬币

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 617  Solved: 275
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

 
 
 

Sample Input

2
25 102

Sample Output

4

HINT

样例解释:共有两只兔纸,价钱分别为25和102。现在小蛇构造1,25,100这样一组硬币序列,那么付第一只兔纸只需要一个面值为25的硬币,第二只兔纸需要一个面值为100的硬币和两个面值为1的硬币,总共两只兔纸需要付4个硬币。这也是所有方案中最少所需要付的硬币数。

1<=N<=50, 1<=ai<=100,000

Source

BZOJ 3233: [Ahoi2013]找硬币( dp )的更多相关文章

  1. BZOJ 3233: [Ahoi2013]找硬币

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

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

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

  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. 【BZOJ 3233】 [Ahoi2013]找硬币

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

  7. [bzoj3233] [Ahoi2013]找硬币

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

  8. [BZOJ 3233] 找硬币

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

  9. BZOJ 3235: [Ahoi2013]好方的蛇

    BZOJ 3235: [Ahoi2013]好方的蛇 标签(空格分隔): OI-BZOJ OI-DP OI-容斥原理 Time Limit: 10 Sec Memory Limit: 64 MB Des ...

随机推荐

  1. Java web项目

    前言 本文目标:使用eclipse为IDE环境搭建一个基于maven的web项目,讲解搭建过程,项目结构,程序运行.调试和测试过程,并使用maven作为持续集成工具.     面向对象:转型java的 ...

  2. 16进制字符串转换为byte数组

    /// <summary> /// 16进制字符转换为byte数组 /// </summary> /// <param name="hexString" ...

  3. foreach的用法(转)

    JDK1.5加入的增强for和循环. foreach语句使用总结增强for(part1:part2){part3}; part2中是一个数组对象,或者是带有泛性的集合. part1定义了一个局部变量, ...

  4. C++ 常见容器

    迭代器. 基本介绍(来源于网络):迭代器是一种抽象的概念.能够遍历容器内的 部分/全部 元素.每个迭代器中包含着元素的地址.  它可以将 抽象容器 和 泛型算法 结合起来.   大致原理: 1)迭代器 ...

  5. Mac ssh登陆linux并且显示linux图形

    背景: Mac 通过[终端]ssh登陆linux并且在Mac显示linux图形 Mac 主机IP: 10.2.1.1 linux 主机IP: 192.168.1.1 说明: 想要ssh访问并且显示li ...

  6. java学习一目了然——异常必知

    java学习一目了然--异常必知 我们只要学java,异常肯定非常熟悉,该抛的时候抛一下就行.但是这其中还有点小细节需要注意.就用这个小短篇来说一下异常处理中的小细节吧. 异常处理 RuntimeEx ...

  7. HD1083 二分图,匈牙利算法

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stdio.h> #include<stdlib. ...

  8. ASP.NET MVC 中@html.ActionLink的几种参数格式

    一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是该链接要显示的文字,第二个参数是对应的控制器的方法, ...

  9. SQL Server 分区表的创建方法与管理

    背景知识: 分区表.可以把表中的数据按范围保存到不同的文件组中. 举个例子吧: 2014年以前的数据保存到文件组A 2014~2015的数据保存到文件组B 2015年以后的数据保存到文件组C 好处: ...

  10. Git 介绍

    一,理解 Git 1,分布式版本控制 Git 版本控制系统的设计思想是"去中心化".传统的 CVS .SVN 等工具采用的是 C/S 架构,只有一个中心代码仓库,位于服务器端.而一 ...