zoj 2156 - Charlie's Change
称号:拼布钱,表面值至1,5。10。25。寻求组成n表面值硬币的最大数目。
分析:dp,01背包。需要二元分割,除此以外TLE。使用每个硬币的数组记录数。轻松升级。
写了一个 多重背包的 O(NV)反而没有拆分快。囧,最后利用了状态压缩优化 90ms;
把 1 cents 的最后处理,其它都除以5,状态就少了5倍了。
说明:貌似我的比大黄的快。(2011-09-26 12:49)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define INF -100001
#define min( a, b ) ((a)<(b)? (a):(b)) int t[ 5 ];
int F[ 2001 ][ 5 ];
int C[ 5 ] = {0,1,1,2,5};
int T[ 5 ][ 15 ]; int main()
{
int P,Q;
while ( scanf("%d",&P) != EOF ) {
for ( int i = 1 ; i <= 4 ; ++ i )
scanf("%d",&t[ i ]); if ( !P ) break;
Q = P%5;
P = P/5;
if ( t[ 1 ] < Q ) {
printf("Charlie cannot buy coffee.\n");
continue;
}t[ 1 ] -= Q;t[ 1 ] /= 5; memset( F, 0, sizeof( F ) );
for ( int i = 1 ; i <= P ; ++ i )
F[ i ][ 0 ] = INF;
F[ 0 ][ 0 ] = F[ 0 ][ 1 ] = Q; //二进制拆分
for ( int i = 2 ; i <= 4 ; ++ i ) {
int base = 1,numb = 0;
while ( t[ i ] >= base ) {
T[ i ][ ++ numb ] = base;
t[ i ] -= base;
base <<= 1;
}
if ( t[ i ] ) T[ i ][ ++ numb ] = t[ i ];
T[ i ][ 0 ] = numb;
} for ( int i = 2 ; i <= 4 ; ++ i ) {
int e = T[ i ][ 0 ];
for ( int j = 1 ; j <= e ; ++ j ) {
int v = T[ i ][ j ];
int u = v*C[ i ];
for ( int k = P ; k >= u ; -- k )
if ( F[ k-u ][ 0 ] >= 0 && F[ k ][ 0 ] < F[ k-u ][ 0 ]+v ) {
for ( int l = 0 ; l <= 4 ; ++ l )
F[ k ][ l ] = F[ k-u ][ l ];
F[ k ][ 0 ] += v;
F[ k ][ i ] += v;
}
}
} //处理 cents 的
for ( int i = t[ 1 ] ; i >= 0 ; -- i )
if ( F[ P-i ][ 0 ] >= 0 ) {
int s = t[ 1 ];
F[ P-i ][ 0 ] += i*5;
F[ P-i ][ 1 ] += i*5;
s -= i;
for ( int j = 4 ; j > 1 ; -- j ) {
int v = min( s/C[ j ], F[ P-i ][ j ] );
F[ P-i ][ j ] -= v;
F[ P-i ][ 1 ] += v*C[ j ];
F[ P-i ][ 0 ] += v*(C[ j ]-1);
s -= v*C[ j ];
}
}
int max = INF,spa = P;
for ( int i = 0 ; i <= t[ 1 ] ; ++ i )
if ( max < F[ P-i ][ 0 ] ) {
max = F[ P-i ][ 0 ];
spa = P-i;
} if ( F[ spa ][ 0 ] <= 0 )
printf("Charlie cannot buy coffee.\n");
else
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",
F[ spa ][ 1 ],F[ spa ][ 2 ],F[ spa ][ 3 ],F[ spa ][ 4 ]); }
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
zoj 2156 - Charlie's Change的更多相关文章
- POJ 1787 Charlie's Change
多重背包 可行性+路径记录 题意是说你要用很多其它的零钱去买咖啡.最后输出你分别要用的 1,5 ,10 .25 的钱的数量. 多重背包二进制分解.然后记录下 这个状态.最后逆向推就可以. #inclu ...
- HDU 4430 & ZOJ 3665 Yukari's Birthday(二分法+枚举)
主题链接: HDU:pid=4430" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=4430 ...
- zoj 1738 - Lagrange's Four-Square Theorem
称号:四方形定理.输出可以表示为一个数目不超过四个平方和表示的数. 分析:dp,完全背包.背包分割整数.可用一维分数计算,它也可以被写为一个二维团结. 状态:设f(i,j,k)为前i个数字,取j个数字 ...
- zoj 3696 Alien's Organ(泊松分布)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3696 Alien's Organ Time Limit: 2 S ...
- zoj 2402 - Lenny's Lucky Lotto Lists
称号:序列,在前面的每个元件的至少两倍,最大值至n.问:长l船舶有许多这样的. 分析:dp,LIS类别似事. 状态:f(i,j)结束数字为j且长度为i的序列的个数.有转移方程: F[ i ][ j ] ...
- HDU 4791 & ZOJ 3726 Alice's Print Service (数学 打表)
题目链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...
- ZOJ 2109 FatMouse' Trade (背包 dp + 贪婪)
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1109 FatMouse prepared M pounds of cat ...
- zoj 1100 - Mondriaan's Dream
题目:在m*n的地板上铺上同样的1*2的地板砖,问有多少种铺法. 分析:dp,组合,计数.经典dp问题,状态压缩. 状态:设f(i,j)为前i-1行铺满,第i行铺的状态的位表示为j时的铺砖种类数: 转 ...
- ZOJ 3587 Marlon's String 扩展KMP
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3587 题意:给出两个字符串S和T.S,T<=100000.拿出 ...
随机推荐
- poj3254(状压dp)
题目连接:http://poj.org/problem?id=3254 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相 ...
- hdu5124(树状数组+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:有n条线段,求被覆盖到次数最多的点的次数 分析: 1.可以转化成求前缀和最大的问题:将区间 ...
- 2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)
题目链接:传送门 题意: n个格子排成一行.我们有m种颜色.能够给这些格子涂色,保证相邻的格子的颜色不同 问,最后恰好使用了k种颜色的方案数. 分析: 看完题目描写叙述之后立刻想到了一个公式 :C(m ...
- XSS跨站攻击
目录 1 XSS跨站攻击简介 1 1.1 什么是XSS 1 1.2 XSS的分类 1 1.3 XSS的危害 1 2 XSS的攻击原理 1 2.1 本地式漏洞攻击 1 2.2 存储式漏洞攻击 2 2.3 ...
- 使用 SQLNET.EXPIRE_TIME 清除僵死连接
数据库连接的客户端异常断开后,其占有的相应并没有被释放,如从v$session视图中依旧可以看到对应的session处于inactive,且对应的服务器进程也没有释放,导致资源长时间地被占用,对于这种 ...
- SVN的命令解析(感觉不错就转了)
本文链接: http://www.php-oa.com/2008/03/12/svnminglingzailinuxxiadeshiyong.html .将文件checkout到本地目录 svn ch ...
- 所有城市list每次从页面花1段时间抽取后写入到数组,
所有城市list每次从页面花1段时间抽取后写入到数组,
- poj2942 Knights of the Round Table,无向图点双联通,二分图判定
点击打开链接 无向图点双联通.二分图判定 <span style="font-size:18px;">#include <cstdio> #include ...
- LeetCode——Valid Sudoku
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- VS2010 TFS
在本文的两个部分中,我将介绍Team Foundation Server的一些核心特征,重点介绍在本产品的日常应用中是怎样将这些特性结合在一起使用的. 作为一名软件开发者,在我的职业生涯中,我常常会用 ...