果汁
来源:互联网 发布:淘宝信誉如何计算 编辑:程序博客网 时间:2024/04/26 23:13
题目描述
罗老师准备了N杯果汁,编号0到N-1,每个杯子有C升容量。刚开始,每个杯子里倒了b[i]升果汁。罗老师会对这些果汁进行一些操作,选择两杯A和B,可以将A倒到B,直到A空了或B满了。
罗老师萌发一个想法,如果一个杯子里最终有x升果汁,那么得分p[x]分,于是罗老师随机为p[0]~p[C]设置了分数。现在问题是,罗老师通过上述操作,最大可以得到多少分?
输入
输入N C
输入N个整数,表示b[i],即每杯初始果汁
输入C+1个整数,表示p[x],即每个杯子中x升果汁得分多少
输出
输出最大得分
样例输入
2 10
5 8
0 0 0 0 0 0 0 0 0 0 10
样例输出
10
提示
【样例说明】
可以倒成一杯3,一杯10,3的得0分,10的得10分
其他样例
input
2 10
5 8
0 0 0 0 0 10 10 10 10 10 10
output
20
input
4 10
4 5 3 7
14 76 12 35 6 94 26 3 93 90 420
output
625
【数据规模和约定】
Solution
乍一看,我们似乎没有任何思路。
但我们发现一个定理
如果对规定的某几个杯子进行互相倾倒的操作,它们最终的含量都是一样的。
然后我们可以发现,一种最优状态必是分成多个子集,每个子集里要么都不动,要么互相倾倒
一个很显然的做法就是处理每种状态互相倾倒的价值
然后枚举状态i,进行转移
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;int n,c,all;int f[33000],val[33000];int b[20],d[20],p[50];void dfs(int k,int len,int now,int pre) //枚举前面的状态{ if(k>len) { f[now]=max(f[now],f[pre]+f[now-pre]); return; } dfs(k+1,len,now,pre-d[k]); dfs(k+1,len,now,pre);} int main(){ cin>>n>>c; for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=0;i<=c;i++) scanf("%d",&p[i]); all=(1<<n)-1; for(int i=1;i<=all;i++) { int l=0; for(int j=1;j<=n;j++) if((i&(1<<(j-1)))>0) { l++; d[l]=b[j]; } for(int j=1;j<=l;j++) for(int k=1;k<=l;k++) if(j!=k&&d[j]!=0&&d[j]!=c&&d[k]!=0&&d[k]!=c) { if(d[j]+d[k]>=c) { int t=d[k]; d[k]=c; d[j]=d[j]-(c-t); } else { d[k]=d[k]+d[j]; d[j]=0; } } for(int j=1;j<=l;j++) val[i]=val[i]+p[d[j]]; } for(int i=1;i<=all;i++) { f[i]=val[i]; //初始化 int l=0; for(int j=1;j<=n;j++) if((i&(1<<(j-1)))>0) { l++; d[l]=(1<<(j-1)); } dfs(1,l,i,i); } cout<<f[all]; return 0;}
阅读全文
0 0
- 果汁
- 果汁
- 可口可乐 与 汇源果汁
- 谷歌果汁:Google Juice
- 熬夜者的营养果汁
- 各种鲜榨果汁配方及制作方法
- 汲取美味营养果汁,我选盖网榨汁机
- 果汁带你学linux(01)
- 熬夜喝5种果汁保健康【适合IT一族】
- 可口可乐对汇源果汁并购案最快本周五获批
- 专家教你五步选购营养果汁
- 聪明红毛猩猩自己拧开水瓶 畅饮果汁消暑
- 一分钟五类果汁喝掉熊猫眼
- 只喝果汁能减肥吗 效果怎么样
- 从一杯果汁浅谈点点医生充值提现模块设计
- 儿子今天吃了俩个汉堡,半个蛋挞,一杯果汁
- 影视后期 after effects 简单实现 灵魂出窍,果汁变糖果,隔空移物视频
- 别羡慕了,这个会榨果汁冲咖啡的不是你女票,是工业机器人!
- Educational Codeforces Round 20 G. Periodic RMQ Problem(线段树动态开点)
- UDP下的epoll并发框架
- 456. 132 Pattern
- maven项目 build war包
- [刷题]ACM ICPC 2016北京赛站网络赛 D
- 果汁
- 编程实战の递归 经典汉诺塔问题
- rpm包的定制
- IIC设备驱动程序(十二)————实例解析linux内核I2C体系结构(1)
- VR系列——Oculus Rift 开发者指南:三、Oculus Rift的渲染(一)
- [日常Debug] Ubuntu16.04出现Initramfs界面解决办法
- Go语言登录表单简单示例
- SQL面试题
- n位格雷码