codevs 1260 快餐问题 DP

题目描述 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

思路

动态规划,数据那么小,四维数组,dp[前i条流水线][a个汉堡][b个薯条][c个饮料]的最大套餐产量。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N=10+2;
const int M=100+5;
int A,B,C,t1,t2,t3,n,tim[N],dp[N][M][M][M],ans=0;
//[前i条流水线][a个汉堡][b个薯条][c个饮料]的最大套餐产量
int max(int x,int y)
{
    if (x>=y) return x;
    else return y;
}
int main()
{
    scanf("%d%d%d%d%d%d%d",&A,&B,&C,&t1,&t2,&t3,&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&tim[i]);
        tim[i]+=tim[i-1];
    }
    for (int i=1;i<=n;i++)
    for (int a=1;t1*a<=tim[i]&&a<=100;a++)
    for (int b=1;t1*a+t2*b<=tim[i]&&b<=100;b++)
    for (int c=1;t1*a+t2*b+t3*c<=tim[i]&&c<=100;c++)
    {
        int x,y;
        x=max(dp[i][a][b][c],dp[i-1][a-A][b-B][c-C]+1);
        dp[i][a][b][c]=max(x,dp[i][a-A][b-B][c-C]+1);
        ans=max(dp[i][a][b][c],ans);
    }
    printf("%d ",ans);
    return 0;
}

但是不能AC!
他说我答案错误。。把数据下载下来本地测试就是对的。。。
求大佬指点

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int a,b,c,p1,p2,p3,n,m[13];
int dp[13][107][107];
int main ( )
{
    scanf("%d%d%d%d%d%d%d",&a,&b,&c,&p1,&p2,&p3,&n);
    for (int i=1;i<=n;i++) 
    scanf("%d",&m[i]);
    memset(dp,-1,sizeof(dp));
    int minn=min(100/a,min(100/b,100/c));
    dp[0][0][0]=0;
    int ans=0;
    for (int i=1;i<=n;i++)
    for (int j=0;j<=minn*a;j++)
    for (int k=0;k<=minn*b;k++)
    for (int j1=0;j1<=j;j1++)
    for (int k1=0;k1<=k;k1++)
    {
        int temp=(j-j1)*p1+(k-k1)*p2 ;
        if (temp<=m[i])
        {
            int tc=(m[i]-temp)/p3;
            if (dp[i-1][j1][k1]!=-1)
            if (dp[i][j][k]>=minn*c) {j1=j+1;break;}
            else dp[i][j][k]=max(dp[i-1][j1][k1]+tc,dp[i][j][k]);
            ans=max(ans,min(dp[i][j][k]/c,min(j/a,k/b)));
        }
    }
    printf("%d\n",ans);
    return 0; 
}

好了改好了

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态规划知识点及一些常见问题分析。动态规划基本原理.........................................................................................................................1 机器分配(HNOI’95)................................................................................................................. 3 最长不下降序列(HNOI’97)..................................................................................................... 4 凸多边形三角划分(HNOI’97)................................................................................................. 6 系统可靠性(HNOI’98)............................................................................................................. 8 快餐问题(HNOI’99)................................................................................................................. 9 求函数最大值(CTSC'95)............................................................................................................. 14 石子合并(NOI’95).................................................................................................................. 15 游览街区(NOI’97).................................................................................................................. 17 积木游戏(NOI’97).................................................................................................................. 20 免费馅饼(NOI’98).................................................................................................................. 24 棋盘分割(NOI’99).................................................................................................................. 27 钉子和小球(NOI’99).............................................................................................................. 30 等。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值