博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj 2156 - Charlie's Change
阅读量:6554 次
发布时间:2019-06-24

本文共 1997 字,大约阅读时间需要 6 分钟。

称号:拼布钱,表面值至1,5。10。25。寻求组成n表面值硬币的最大数目。

分析:dp,01背包。需要二元分割,除此以外TLE。使用每个硬币的数组记录数。轻松升级。

 

            写了一个 多重背包的 O(NV)反而没有拆分快。囧,最后利用了状态压缩优化 90ms;

            把 1 cents 的最后处理,其它都除以5,状态就少了5倍了。

说明:貌似我的比大黄的快。(2011-09-26 12:49)。

#include 
#include
#include
#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; }

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
如何在Linux命令行中创建以及展示演示稿
查看>>
FutureTask——另一种闭锁的实现
查看>>
js-ES6学习笔记-Proxy
查看>>
Android和MVC
查看>>
Linux 用户和用户组管理
查看>>
RIP路由协议及工作原理
查看>>
tomcat架构分析(valve源码导读)
查看>>
spring中InitializingBean接口使用理解(转)
查看>>
基于php5.5使用PHPMailer-5.2发送邮件
查看>>
android java.lang.SecurityException: Permission Denial: not allowed to send broadcast
查看>>
InstallShield 2012 Spring新功能试用(16): Suite/Advanced UI 或 Advanced UI安装程序能在安装时进行输入合法性校验与反馈...
查看>>
【转】正则表达式高级讲解
查看>>
C#面试宝典
查看>>
三种排序算法python源码——冒泡排序、插入排序、选择排序
查看>>
基金项目的英文
查看>>
.NET平台下使用MongoDB入门教程
查看>>
《软件性能测试与LoadRunner实战教程》喜马拉雅有声图书上线
查看>>
R语言可视化学习笔记之ggpubr包—SCI文章图
查看>>
【linux+C】通过几个实例温习指针
查看>>
HDU 1015 Safecracker 解决问题的方法
查看>>