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.拿出 ...
随机推荐
- c#操作.mpp文件
原文地址:http://mjm13.iteye.com/blog/532404 所需设置 在工程中增加引用Microsoft Project 11.0 Object Library,该引用在co ...
- poj 1659 Frogs' Neighborhood (度序列)
Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 7295 Accepted: 31 ...
- python中print,return和yield的区别
def func1(): for i in range(1, 5): print i def func2(): for i in range(1, 5): return i def func3(): ...
- Oracle单表的复杂查询
Oracle单表的复杂查询 select avg(sal),max(sal),deptnofrom empgroupby deptno; orderby deptno; 查询工资高于500或者是岗位为 ...
- SWT的文件选择对话框I的使用
swt文件选择框 FileDialog fileselect=new FileDialog(shell,SWT.SINGLE); fileselect ...
- 本科非cs菜鸟计算机面试实录
两年制小硕,本硕期间差不多都打酱油的.本科非cs专业,硕士cs,编程基础一般,专业基础尚可.研究生期间分析分析了pgsql数据库的源码:同时实验室一些杂项目:自己业余为了应试读了些计算机书.自己当时q ...
- 消息队列(Message Queue)基本概念(转)
背景 之前做日志收集模块时,用到flume.另外也有的方案,集成kafaka来提升系统可扩展性,其中涉及到消息队列当时自己并不清楚为什么要使用消息队列.而在我自己提出的原始日志采集方案中不适用消息队列 ...
- 【教你zencart仿站 文章1至6教训 高清1280x900视频下载】[支持手机端]
[教你zencart仿站 第1至6课 高清晰1280x900视频下载][支持移动端] 经过筹备, 我们的课件最终出来了- 我们 zencart联盟合伙人 项目推出的 在线yy同步演示zencart仿站 ...
- Xamarin:制作并发布apk
原文:Xamarin:制作并发布apk 终于到了激动人心的时刻:要向真机发布apk了.流程如下: 1 制作release版的android应用安装包apk文件: 1.1 用VS2012中文版制作:记得 ...
- spring问题排查-调低日志等级
问题描写叙述 1. 页面经过一次改动后,提交后页面出现400错误,可是后台并没有输出不论什么错误信息. 2. debug监听应页面对应的提交链接也没有不论什么反应(没有进入后台的controller方 ...