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.拿出 ...
随机推荐
- poj3414(bfs)
题目链接:http://poj.org/problem?id=3414 题意:给你两个容器 A B 问是否能够经过有限的步骤倒水,得到容量为 C 的水,输出最小的步数,同时输出每一步的操作.如果不能 ...
- POJ2155:Matrix(二维树状数组,经典)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- 《数字图像处理原理与实践(MATLAB版)》一书之代码Part2
本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part2(P43~80),代码运行结果请參见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MA ...
- Jquery插件placeholder的用法
闲的蛋疼,演示一下Jquery插件placeholder的用法,借助该插件能够轻松实现HTML5中placeholder特效: 效果图: 实现代码: <%@ page language=&quo ...
- LNK1207: incompatible PDB format in********
LNK1207: incompatible PDB format in******** VC中错误:LINK : fatal error LNK1207: incompatible PDB forma ...
- hdu2126(求方案数的01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意: n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数. 分析:一看 ...
- 自己定义 ViewGroup 支持无限循环翻页之三(响应回调事件)
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处,再次感谢 ################################ ...
- cocoa动态方法决议及消息转发
假设给一个对象发送不能响应的消息,同一时候又没有进行动态方法决议,又没实现消息转发,那么就会引发以下的crash信息 2014-07-30 15:47:54.434 MethodNotFind[171 ...
- sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在使用Hibernate的J2EE项目中,莫名其妙出现如上错误,既不报错,也不运行不论什么输出測试代码,更不返回结果. 经过排查,在方法里面引用的实体类和其映射文件属性个数不一致. 改动一致后,即解决 ...
- The Swift Programming Language 中国版
iSwifting社会的 Swift 兴趣交流群:303868520 iOS 微信公众账号:iOSDevTip Swift 微信公众账号:SwiftDev iSwifting社区 假设你认为这个项目不 ...