果汁
来源:互联网 发布:中艺黄金待遇 知乎 编辑:程序博客网 时间:2024/04/23 16:49
题目描述
罗老师准备了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分
其他样例
输入
2 10
5 8
0 0 0 0 0 10 10 10 10 10 10
输出
20
输入
4 10
4 5 3 7
14 76 12 35 6 94 26 3 93 90 420
输出
625
【数据规模和约定】
1<=N<=15
1<=C<=49
0<=b[i]<=C
0<=p[x]<=1,000,000
题解
我们发现,一杯满的果汁或空的果汁对于别的果汁是没有影响的,于是我们可以采用状压+记忆化搜索,对于一个集合N表示集合N的果汁能产生的最大分数,于是我们可以枚举,把集合分为两个,计算子集合的最大价值,从而得到最优解。
代码
#include<cstdio>#include<cstring>#include<iostream>#include<cmath>int dp[1<<16],b[20],p[55];int n,c;using namespace std;inline int read(){ int x=0;char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x;}int dfs(int k){ if (dp[k]!=-1) return dp[k]; int cnt=0,sum=0; int a[16]; for (int i=0;i<n;i++) { if (k&1<<i) { a[cnt]=i; cnt++; sum+=b[i]; } } dp[k]=(sum/c)*p[c]; if (sum%c==0) dp[k]+=(cnt-sum/c)*p[0]; else dp[k]+=p[sum%c]+(cnt-sum/c-1)*p[0]; int N=(1<<cnt)-1; for (int i=(k-1)&k;i>0;i=(i-1)&k) dp[k]=max(dp[k],dfs(i)+dfs(k^i)); return dp[k];}int main(){ memset(dp,-1,sizeof(dp)); n=read();c=read(); for (int i=0;i<n;i++) b[i]=read(); for (int i=0;i<=c;i++) p[i]=read(); printf("%d",dfs((1<<n)-1));}
0 0
- 果汁
- 果汁
- 可口可乐 与 汇源果汁
- 谷歌果汁:Google Juice
- 熬夜者的营养果汁
- 各种鲜榨果汁配方及制作方法
- 汲取美味营养果汁,我选盖网榨汁机
- 果汁带你学linux(01)
- 熬夜喝5种果汁保健康【适合IT一族】
- 可口可乐对汇源果汁并购案最快本周五获批
- 专家教你五步选购营养果汁
- 聪明红毛猩猩自己拧开水瓶 畅饮果汁消暑
- 一分钟五类果汁喝掉熊猫眼
- 只喝果汁能减肥吗 效果怎么样
- 从一杯果汁浅谈点点医生充值提现模块设计
- 儿子今天吃了俩个汉堡,半个蛋挞,一杯果汁
- 影视后期 after effects 简单实现 灵魂出窍,果汁变糖果,隔空移物视频
- 别羡慕了,这个会榨果汁冲咖啡的不是你女票,是工业机器人!
- jQuery的选择器
- 附件
- Linux下的OpenCV安装
- Java建立二叉排序树
- 2.3.1 Bee
- 果汁
- 运行本地php练习,浏览器有时无法响应
- phabricator 基本配置
- 史上最全最强SpringMVC详细示例实战教程
- static clinit死锁问题
- 【设计模式】工厂方法模式
- 基于X.509证书和SSL协议的身份认证过程实现
- 编译原理词法分析(java)
- Validate Binary Search Tree