您的位置:首页 > 其它

10680 飞机

2016-05-09 17:09 239 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: