UVa 242 - Stamps and Envelope Size(DP)
2015-08-29 18:10
344 查看
给出一个ss,然后给出nn组邮票,问那一组可以凑出最大连续邮资。
对每一组邮票,求出当邮资为i时需要邮票数的最小值d[i]d[i],边界为d[0]=0d[0]=0、d[i]>sd[i]>s时break。类似于背包问题的求法,具体方法见代码。
对每一组邮票,求出当邮资为i时需要邮票数的最小值d[i]d[i],边界为d[0]=0d[0]=0、d[i]>sd[i]>s时break。类似于背包问题的求法,具体方法见代码。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1010; int d[maxn],ans[20],num[20],a[20][20]; int main(){ int s; while(~scanf("%d",&s)&&s){ int n;scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&num[i]); for(int j=1;j<=num[i];++j) scanf("%d",&a[i][j]); memset(d,0x3f,sizeof(d)); d[0]=0; for(int j=1;j<maxn;++j){ for(int k=1;k<=num[i]&&j-a[i][k]>=0;++k) d[j]=min(d[j],d[j-a[i][k]]+1); if(d[j]>s){ans[i]=j-1;break;} } } int best=-1,pos=0; for(int i=1;i<=n;++i){ if(ans[i]>best) best=ans[i],pos=i; else if(ans[i]==best){ if(num[i]<num[pos]) pos=i; else if(num[i]==num[pos]){ bool ok=false; for(int j=num[i];j>0;--j) if(a[i][j]!=a[pos][j]){ ok=a[i][j]<a[pos][j]; break; } if(ok) pos=i; } } } printf("max coverage =%4d :",ans[pos]); for(int i=1;i<=num[pos];i++) printf("%3d",a[pos][i]); printf("\n"); } return 0; }
相关文章推荐
- Linux FTP 服务器配置简单说明(转)
- linux 命令
- 使用cargo实现jenkins自动部署远程tomcat
- UVa 10934 - Dropping water balloons(DP)
- CentOS图形界面的开启与关闭
- Tomcat在RedHat Linux上的安装与配置
- linux磁盘管理:LVM的基本概念与创建、扩展、缩减、删除
- linux环境下LNMP和mantis的配置笔记
- Linux忘记root密码解决办法
- 网页网站开发
- linux运维实战练习--用户和组管理各命令的使用
- 使用Docker部署PHP应用的设计方案
- linux常用命令汇总(pwd,echo,history,nano)
- NAND FLASH控制器
- Linux系统下如何SSH免密码登录
- 44_02 nginx
- Apache与Tomcat
- linux驱动调试技术
- Zabbix监控平台汉化修改
- Shell编程(正则表达式)学习笔记