10680 飞机

10680 飞机
该题有题解

时间限制:1000MS 内存限制:65535K
提交次数:89 通过次数:27

题型: 编程题 语言: G++;GCC
Description
某国成立了一个新的航空公司。该公司准备采购飞机来运营属下的两条航线A与B。他们联系了一些飞机制造商,这些制造商提供了他们飞机的资料。
资料里面记录了每种飞机的载客量,以及他们飞航线A与航线B所需要的燃油量。

通过市场调查,该公司摸清了两条航线的日均客流量。已知该航空公司每日能够采购到一定数目的燃油。目前,该公司在制定采购计划,

对于所有型号的飞机,他们可以采购任意数目。然而,他们正在怀疑,在燃油数目的限制下,他们的采购能否可以满足两条航线的客流量。
请写一个程序解决这个问题,作出回答。

输入格式
测试数据包括多组样例。数据以CASE开头,表示测试样例的数目。
对于每组样例,第1行有两个整数,n与fuel,表示供航空公司采购的飞机种类数目,以及他们每日能够采购到的燃油数目。
(1<=n<=1000, 0<=fuel <= 1000)
第2行有两个整数:p1,p2,表示两条航线每日的客流量。
第3行有n个整数:c1,c2,…,cn,每个数字表示第i个型号的飞机的载客量。
第4行有n个整数:f11,f12,…,f1n,每个数字表示第i个型号的飞机飞航线A的耗油量。
第5行有n个整数:f21,f 22,…,f2n,每个数字表示第i个型号的飞机飞航线B的耗油量。

输出格式
对于每个样例的输出均为一行,包括一个数字:0或者1。
如果采购商给出的飞机列表在燃油的限制条件下,能够满足两条航线的客流,输出1,否则输出0。

输入样例
2
3 16
299 499
100 200 250
2 3 4
3 5 6

3 17
299 499
100 200 250
2 3 4
3 5 6

输出样例
0
1

提示
第一个样例中,有3种飞机可供采购。但是由于每日燃油的限制,无论如何采购,都无法满足两条航线的载客任务。
第二个样例中,有3种飞机可供采购。航线A需要两架飞机运营:第1种飞机1架,第2种飞机1架。航线B需要2架飞机运营:第三种飞机2架。
这个解决方案每日的耗油量是2+3+6+6=17,满足题目要求。

来源 by PKKJ

题意:dp题,燃油量理解为物体重量,购得的燃油量理解为背包重量,载客量为物体价值,但该题除了要求物体重量要小于背包重量,还要求物体价值大于等于所给出的价值。
解题思路:同样建立dp[i],dp2[i]代表有i燃油量的情况下能获得的A或B线路最大载客量,当此时载客量大于等于A或B线路的最小载客量时,则标志i为A或B线路为最小燃油量,的状态方程为依然为dp[i]=max(dp[i],dp[i-f[j]]+c[j]);(f[j]为A线路燃油量,c为该飞机载客量),最后判断两个最小燃油量相加以后小于等于采购得的最小燃油量,如果是,输出1,否则输出0.

#include <iostream>
#include <cstdio>
#include <cstring>
int c[1005],f[1005],h[1005],dp[1005],dp2[1005];

using namespace std;

int main()
{
    int T,n,fuel,p,q,i,k;
    cin>>T;
    while(T--)
    {
        memset(dp,0,sizeof(dp));//初始化dp1
        memset(dp2,0,sizeof(dp2));//初始化dp2
        scanf("%d%d",&n,&fuel);
        scanf("%d%d",&p,&q);
        int min1=2000,min2=2000;//从最小耗油量的飞机开始计算
        for(i=0;i<n;i++)
        {
            scanf("%d",&c[i]);
        }
        for(i=0;i<n;i++)
        {
            scanf("%d",&f[i]);
            min1=min(min1,f[i]);
        }
        for(i=0;i<n;i++)
        {
            scanf("%d",&h[i]);
            min2=min(min2,h[i]);
        }
        for(i=min1;i<=fuel;i++)//有i燃料量情况下,可以获得A线路的最大载客量
        {
            for(int j=0;j<n;j++)//每架飞机判断一次
            {
                if(i>=f[j])
                {
                    dp[i]=max(dp[i],dp[i-f[j]]+c[j]);
                }
            }
            if(dp[i]>=p)//如果满足最小载客量,则退出循环
                break;
        }
        for(k=min2;k<=fuel;k++)
        {
            for(int j=0;j<n;j++)
            {
                if(k>=h[j])
                {
                    dp2[k]=max(dp2[k],dp2[k-h[j]]+c[j]);
                }
            }
            if(dp2[k]>=q)
                break;
        }
        if(i+k<=fuel)//如果A线路B线路所需最小燃油量小于可以采购得到的燃油量,输入1
        printf("1\n");
        else
        printf("0\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值