wikioi 快餐问题
来源:互联网 发布:知乎 发表文章挣钱 编辑:程序博客网 时间:2024/04/28 13:20
题目描述 Description
Peter最近在R市开了一家快餐店,为了招揽顾客,该快餐店准备推出一种套餐,该套餐由A个汉堡,B个薯条和C个饮料组成。价格便宜。为了提高产量,Peter从著名的麦当劳公司引进了N条生产线。所有的生产线都可以生产汉堡、薯条和饮料,由于每条生产线每天所能提供的生产时间是有限的、不同的,而汉堡、薯条和饮料的单位生产时间又不同,这使得Peter很为难,不知道如何安排生产才能使一天中生产的套餐产量最大。请你编写程序,计算一天中套餐的最大生产量。为简单起见,假设汉堡、薯条和饮料的日产量不超过100个。
输入描述 Input Description
第一行为三个不超过100的正整数A、B、C,中间以一个空格分开;
第二行为三个不超过100的正整数p1、p2、p3分别为汉堡、薯条和饮料的单位生产耗时。中间以一个空格分开。
第三行为一个整数N(0≤N≤10)代表流水线;
第四行为M个不超过10000的正整数,分别为各条生产流水线每天提供的生产时间,中间以一个空格分开。
输出描述 Output Description
输出文件仅一行,即每天套餐的最大产量。
样例输入 Sample Input
1 2 1
1 2 1
5
16 16 8 9 14
样例输出 Sample Output
10
题解
这道题我没看题解还真想不出来。解析大致如下
由于每条生产线的生产是相互独立,不互相影响的,所以用f[i][j][k]表示第i条生产线生产j个汉堡,k个薯条的情况下最多可生产饮料的个数
f[i][j][k]=max(f[i][j][k],f[i-1][j-j1][k-k1]+(t[i]-j1*p1-k1*p2)/p3) 其中(0<=j1<=j,0<=k1<=k,且(j-j1)*p1+(k-k1)*p2<= t[ i ]).
但此算法的时间复杂度为O(N*1004),当N=10 就无法承受。但可以发现:这道题中存在着一个上限值(Min{100 div A, 100 div B, 100 div C}),所以我们可以先用贪心法算出N条生产线可以生产的套数,如果大于上限值则可以推出循环,否则再调用动态规划。这样就能过了。
代码如下:
#include<cstdio>#include<cstring>#include<iostream>#include<cstdlib>#include<cmath>using namespace std;int a,b,c,p1,p2,p3,n;int t[12],f[12][102][102],maxn,ans;//f[i][j][k]表示第i条生产线生产j个汉堡,k个薯条的情况下最多可生产饮料的个数 int main(){scanf("%d%d%d",&a,&b,&c);scanf("%d%d%d",&p1,&p2,&p3);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&t[i]);int maxn=min(100/a,min(100/b,100/c)); //因为题目“假设汉堡、薯条和饮料的日产量不超过100个。”memset(f,-1,sizeof(f)); f[0][0][0]=0;for(int i=1;i<=n;i++) for(int j=0;j<=maxn*a;j++) for(int k=0;k<=maxn*b;k++) for(int j1=0;j1<=j;j1++) for(int k1=0;k1<=k;k1++) {if(f[i-1][j-j1][k-k1]!=-1 && t[i]-j1*p1-k1*p2>=0) //保证状态是合法的 {if(f[i][j][k] >= maxn*c) {break;}//不能直接输出maxn,否则会错。 f[i][j][k]=max(f[i][j][k],f[i-1][j-j1][k-k1]+(t[i]-j1*p1-k1*p2)/p3); } } for(int i=0;i<=maxn*a;i++) for(int j=0;j<=maxn*b;j++) ans=max(ans,min(i/a,min(j/b,f[n][i][j]/c))); printf("%d",ans); return 0;}
- wikioi 快餐问题
- wikioi 1260 快餐问题
- 快餐问题
- wiki-1260-快餐问题
- wiki 1260 快餐问题
- 1260 快餐问题
- Codevs 1260 快餐问题
- codevs 1260 快餐问题 DP
- wikioi-1014 装箱问题
- wikioi p1014 装箱问题
- 【wikioi】1014 装箱问题
- WIKIOI 1282 约瑟夫问题
- wikioi 1029 遍历问题
- wikioi 1282 约瑟夫问题
- WIKIOI-1014 装箱问题
- [Wikioi 1226]倒水问题
- 【wikioi】N皇后问题
- wikioi约瑟夫问题c++
- 项目经历
- JavaScript高级之函数的四种调用形式
- apk打包流程图
- 互联网思维下的传统企业转型思考
- String常用方法汇总
- wikioi 快餐问题
- mina 学习(1)
- [程序员知识]一些“不正规”的软件项目招标前小技巧
- Web_CSS_DIV相对浏览器定位及其关闭;
- 搜索之DFS
- Linux系统时间偏差的纠正
- hdu 1399 Starship Hakodate-maru (爆搜- -也能算枚举)
- WDF框架下 硬盘的虚拟
- grub双系统引导设置